Вложенное использование nonlocal
и global
для одной и той же переменной невозможно. nonlocal
ссылается на переменную из ближайшей неглобальной области видимости. После объявления переменной как nonlocal
, доступ к ней из еще более внешней (глобальной) области видимости напрямую невозможен.
Чтобы изменить глобальную переменную из функции, внутри которой она была упомянута как nonlocal
вложенной функцией, нужно использовать global
в исходной функции, а не во вложенной. Альтернативно, можно реорганизовать код, избегая такой вложенной зависимости.
В Python ключевое слово nonlocal
используется для доступа к переменной ближайшей внешней неглобальной области видимости. Это означает, что оно позволяет изменять переменную, объявленную во внешней функции (но не в глобальной области видимости) из внутренней функции.
Однако, если вы попытаетесь изменить глобальную переменную внутри функции, где эта же переменная уже была объявлена как nonlocal
, то столкнетесь с SyntaxError: no binding for nonlocal 'имя_переменной' found
.
Это происходит потому, что nonlocal
не предназначено для работы с глобальными переменными. nonlocal
говорит интерпретатору искать переменную во внешней неглобальной области видимости. Глобальная область видимости исключается из поиска nonlocal
.
Для изменения глобальной переменной внутри функции необходимо использовать ключевое слово global
. Нельзя использовать одновременно и nonlocal
, и global
для одной и той же переменной в одной и той же функции.
Вот пример, демонстрирующий проблему и решение:
global_var = 10
def outer_function():
local_var = 5
def inner_function():
# Попытка использовать nonlocal для глобальной переменной, если была объявлена локально в outer_function, приведет к ошибке, если попытаться объявить её как nonlocal
# nonlocal global_var # SyntaxError: no binding for nonlocal 'global_var' found
nonlocal local_var # Всё хорошо, так как local_var - переменная внешней неглобальной области видимости
local_var += 1
global global_var # Используем global для доступа к глобальной переменной
global_var += 1
inner_function()
print(f"Local variable in outer function: {local_var}")
outer_function()
print(f"Global variable: {global_var}")
Объяснение:
global_var
- глобальная переменная.outer_function
содержит local_var
- локальную переменную для этой функции.inner_function
пытается изменить global_var
. Для этого внутри inner_function
используется ключевое слово global
.nonlocal
используется для изменения переменной local_var
, определенной в outer_function
.Ключевой вывод: Нельзя использовать nonlocal
для глобальных переменных. Используйте global
для работы с глобальными переменными внутри функций.