Нелокальные области видимости переменных в Python — примеры
В этом руководстве вы узнаете о нелокальных областях видимости в Python и о том, как использовать ключевое слово nonlocal для изменения переменных нелокальных областей.
Введение в нелокальные области видимости в Python
В Python вы можете определить функцию внутри другой функции. Например:
def outer(): print('outer function') def inner(): print('inner function') inner() outer()
Выход:
outer function inner function
В этом примере мы определили функцию под названием external.
Внутри внешней функции мы определили другую функцию, называемую внутренней. И мы вызвали внутреннюю функцию изнутри внешней функции. Часто мы говорим, что внутренняя функция вложена во внешнюю функцию. На практике вы определяете вложенные функции, когда не хотите, чтобы эти функции были глобальными.
И внешние, и внутренние имеют доступ к глобальным и встроенным областям, а также к их локальным областям. И внутренняя функция также имеет доступ к охватывающей ее области, которая является областью действия внешней функции.
С точки зрения функции Internal() ее объем не является ни локальным, ни глобальным. И Python называет это нелокальной областью видимости.
Давайте изменим внешние и внутренние функции:
def outer(): message = 'outer function' print(message) def inner(): print(message) inner() outer()
Выход:
outer function outer function
Когда мы вызываем внешнюю функцию, Python создает внутреннюю функцию и выполняет ее.
Когда внутренняя функция выполняется, Python не находит переменную сообщения в локальной области. Поэтому Python ищет ее во внешней области видимости, которая является областью видимости внешней функции:
См. следующий пример:
message = 'global scope' def outer(): def inner(): print(message) inner() outer()
Выход:
global scope
В этом примере Python ищет переменную message в локальной области внутренней функции.
Поскольку Python не находит переменную, он ищет переменную в охватывающей ее области, которая является областью действия внешней функции.
И в этом случае Python обращается к глобальной области видимости, чтобы найти переменную:
Ключевое слово nonlocal в Python
Чтобы изменить переменные из нелокальной области в локальной области, используйте ключевое слово nonlocal. Например:
def outer(): message = 'outer scope' print(message) def inner(): nonlocal message message = 'inner scope' print(message) inner() print(message) outer()
Выход:
outer scope inner scope inner scope
В этом примере мы используем ключевое слово nonlocal, чтобы явно указать Python, что мы модифицируем нелокальную переменную.
Когда вы используете ключевое слово nonlocal для переменной, Python будет искать переменную в охватывающей ее цепочке локальных областей до тех пор, пока не встретит имя переменной. Что еще более важно, Python не будет искать переменную в глобальной области видимости.
Рассмотрим следующий пример:
message = 'outer scope' def outer(): print(message) def inner(): nonlocal message message = 'inner scope' print(message) inner() print(message) outer()
Если вы запустите этот код, вы получите следующую ошибку:
SyntaxError: no binding for nonlocal 'message' found
Внутри внутренней функции мы используем ключевое слово nonlocal для переменной message.
Поэтому Python ищет переменную сообщения во внешней области видимости, которая является областью действия внешней функции.
Поскольку в области внешней функции нет переменной сообщения, а Python не смотрит дальше в глобальной области, он выдает ошибку: