Как изменить глобальную переменную внутри функции, если она уже была объявлена внутри другой функции как `nonlocal`?

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

0