nonlocal
используется для доступа и изменения переменных из внешней, но не глобальной области видимости. Позволяет изменять переменные в родительских функциях (не глобальной области видимости), внутри вложенных функций. Без nonlocal
, присваивание значения переменной внутри вложенной функции создало бы новую локальную переменную с тем же именем.
Ключевое слово nonlocal
в Python используется для обращения к переменной из ближайшей внешней области видимости, но не из глобальной области видимости. По сути, оно позволяет изменять переменные, определенные в замыкающей функции (enclosing function scope), из внутренней вложенной функции.
Рассмотрим пример:
def outer_function():
message = "Hello"
def inner_function():
nonlocal message
message = "World"
inner_function()
print(message) # Выведет "World"
В этом примере:
outer_function
определяет переменную message
.inner_function
вложена в outer_function
.nonlocal message
указывает, что переменная message
, к которой идет обращение внутри inner_function
, является переменной из области видимости outer_function
. Без nonlocal
, inner_function
создала бы новую локальную переменную с именем message
.inner_function
изменяет message
, она изменяет переменную, объявленную в outer_function
.Важно отметить:
nonlocal
нельзя использовать в глобальной области видимости.nonlocal
ищет переменные только в родительских функциях, но не в глобальной области видимости или встроенной области видимости.SyntaxError
.nonlocal
используется для изменения состояния в замыканиях, когда необходимо, чтобы внутренняя функция могла изменять переменные во внешней функции.Пример с ошибкой:
message = "Global"
def outer_function():
def inner_function():
nonlocal message # Ошибка: nonlocal name 'message' found but not in any enclosing scopes
message = "World"
inner_function()
print(message)
outer_function()
В этом случае, nonlocal message
не работает, так как message
определена в глобальной области видимости, а не в родительской функции по отношению к inner_function
. Чтобы обратиться к глобальной переменной, следует использовать ключевое слово global
.
В заключение, nonlocal
позволяет внутренней функции изменять переменные, определенные в ее родительской функции, что полезно для управления состоянием в замыканиях.