Написать пост

Области видимости в Python, о которых вы не знали

Аватарка пользователя Елена Капаца

Рассказываем обо всех четырех областях видимости Python, которые нужно освоить разработчикам, и о том, как их использовать.

Обложка поста Области видимости в Python, о которых вы не знали

Область видимости (scope) — это та часть кода, где переменная доступна, открыта и видима. Это одна из первых вещей, на которую обращают внимание в любой школе программирования Python, так что даже новички с ней, как правило, знакомы.

Если бы не подсказки IDE, неизвестно, сколько бы длилась отладка соответствующих участков кода у среднего питониста. Так что если вы стремитесь расширить спектр навыков, время выйти за привычные представления о двух областях и освоить все четыре.

1 + 2. Локальная (Local) и глобальная (Global)

Сразу видно глобальную переменную – global. Она удобна в использовании, но не безопасна. При разрастающемся коде легко добиться ситуации, что переменная меняется несколько раз, и это создает лазейки для ее перезаписи всем желающим. Впрочем, за семь лет программирования проблемных ситуаций на этой почве у меня не возникло ни разу. Но информационной безопасностью не занимаюсь.

Заполучить вторую переменную local в сниппете ниже можно только при вызове func():

			>>> global = "Глобальная переменная"
>>>>>> def func():
>>>    local = "Локальная переменная"
>>>    print(local)
>>>
>>> print(global)
>>> func()... Глобальная переменная... Локальная переменная
		

Глобальные переменные плохи тем, что делают код менее гибким. Например, если два модуля имеют общую глобальную переменную, мы не можем изменить одну, не учитывая, как это повлияет на другую. Более того, глобальные переменные могут быть изменены любой частью скрипта, что затрудняет отслеживание изменений и потенциально может привести к уязвимостям в системе безопасности.

Локальные переменные ни хороши, ни плохи сами по себе. Но дают возможность переиспользовать одно и то же имя переменной в коде несколько раз. Возможно, некоторые из вас уже понимают, сколько раз за скрипт можно переиспользовать счетчик i.

3. Охватывающая (Enclosing)

Позволяет «выходить» из локальной о.в. на верхний уровень — но не глобальный. Допустим, у нас есть функция func1(), в которой определена еще одна функция func2(). Оператор nonlocal позволяет внутренней переменной enclosing выйти на уровень видимости «верховной» функции:

			>>> def func1():
>>>         enclosing = "Первый уровень"
>>>         print(enclosing)
>>> 
>>>         def func2():
>>>             nonlocal enclosing
>>>             enclosing = "Второй уровень"
>>> 
>>>         func2()
>>>         print(name)
>>> 
>>> func1()
... Первый уровень
... Второй уровень
		

Такие звери нужны, если вы используете вложенные функции, что в целом случается нечасто. Самый простой пример употребления – цикл внутри цикла, счетчик i и снаружи, и внутри.

4. Встроенная (Built-in)

Самая широкая область. В ней есть все привычные «персонажи», которые загружаются в область переменных Python при запуске интерпретатора. К примеру, имя файла автоматически становится встроенной переменной, и к ней мы обращаемся с помощью двух подчеркиваний:

			Скрипт.py
>>> print("File1 __name__ = %s" %__name__)
... Скрипт
		

Зарезервированные слова тоже относят к этой категории:

Области видимости в Python, о которых вы не знали 1

Заключение

Для удобства восприятия вашему вниманию диаграмма, условно характеризующая взаимоотношения этих четырех видов переменных:

Области видимости в Python, о которых вы не знали 2

Стоит отметить, что не всем питонистам это понятие пригождается каждый день. Области видимости – повседневность фулстэк-разработчика, но не дата-сайентиста. Так что волноваться на ее счет особо не стоит, пока вы осознаете, каким именно программистом хотите стать.

Какие области вам были знакомы?
Глобальная, локальная
Все
Ни одной, только учусь
Следите за новыми постами
Следите за новыми постами по любимым темам
3К открытий4К показов