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 позволяет внутренней функции изменять переменные, определенные в ее родительской функции, что полезно для управления состоянием в замыканиях.