Области видимости
Области видимости (scopes) в языке Python - это текстовые участки программы, откуда напрямую доступны определенные пространства имен. Другими словами, это области, в которых определяется ограниченный набор переменных и в которых в первую очередь будет осуществляться их поиск при не специфическом запросе. Среди областей видимости можно выделить так внутреннюю (local scope), нелокальную (nonlocal/enclosing scope), глобальную (global scope) и внешнюю (Built-in scope) области.
Содержание
Local scope
Теория
Самая внутренняя, узкая область видимости. Здесь, например, будут располагаться переменные, объявленные внутри конкретной функции. Это пространство имен создается непосредственно при вызове данной функции. Именно здесь в первую очередь будет проводиться поиск переменных, к которым происходит обращение в данной функции.
Пример
def func(): a = 42 #Переменная а объявлена внутри данной функции print(a) func(a) #Поиск по local scope увенчался успехом, на экране будет 42
Nonlocal scope
Теория
Это область, включающая в себя пространства имен тех функций, которые вызвали ту, с которой мы работаем в данный момент. Поиск переменных, не объявленных непосредственно в данной функции, будет идти "снизу вверх" - сначала в пространстве имен функции, вызвавшей рассматриваемую, затем в пространстве имен той функции, которая вызвала уже ее, и так далее
Полезный синтаксис
Как было сказано выше, переменные, объявленные внутри функции, при завершении выполнения этой функции пропадут. Тем самым, поменяв значение переменной а на 42 внутри функции func1(), по завершении этой функции обратиться к переменной а мы уже не сможем, пока не объявим ее еще раз где-то еще. Если мы хотим выполнить функцию func2(), которая запускает выполнение func1(), и хотим использовать именно переменную a = 42 внутри func2(), можно воспользоваться командой nonlocal a
Пример
def func2(): def func1(): nonlocal a a = 42 a = 29 func1() print(a) func2() #На экране увидим не 29, а 42.
Global scope
Теория
Здесь располагаются имена, объявленные непосредственно в считываемых модулях. По сути, они располагаются в блоке __main__ [1] данного модуля. Поиск имен переменных здесь будет осуществляться в том случае, когда искомых имен не было ни в во внутренней области видимости, ни в нелокальной.
Полезный синтаксис
По аналогии с nonlocal, можно внутри функции менять значение переменной, находящейся в global scope. Как нетрудно догадаться, этой командой будет global a.
Пример
def func1(): global a a = 42 a = 29 func1() print(a) #42!
Built-in scope
Теория
Внешняя область видимости - это пространство имен, содержащее встроенные в язык Python имена переменных. К этим именам можно обращаться в любом месте программы без их предварительного объявления. На самом деле, эти имена содержатся в модуле builtins [2]. В случае, если переменные с такими же именами будут явно объявлены в коде, в качестве значения таких переменных будет взято именно объявленное.
Пример
False, True, None, range и многое другое.
Общий пример
def scope_test(): def do_local(): spam = 'local spam' def do_nonlocal ( ) : nonlocal spam spam = 'nonlocal spam' def do_global(): global spam spam = 'global spam' spam = 'test spam' do_local()# 'test spam', потому что то, что мы сделали внутри функции, остается внутри функции print ('After local assignment: ', spam) do_nonlocal()# 'nonlocal spam', потому что мы хотели поменять spam в nonlocal scope и поменяли print( 'After nonlocal assignment: ', spam) do_global() # 'nonlocal spam', потому что мы хотели поменять spam в global scope, а в nonlocal scope больше не трогали print('After global assignment: ', spam) scope_test() # 'global spam', потому что do_global все-таки сработала print ('In global scope: ', spam)
Ссылки
- ↑ документация языка Python, https://docs.python.org/3/library/__main__.html#module-__main__
- ↑ Модуль builtins, https://docs.python.org/3/library/builtins.html#module-builtins