В каких случаях можно использовать `nonlocal` вместо `global`?

Использовать nonlocal вместо global следует, когда необходимо изменить переменную в ближайшей внешней неглобальной области видимости (например, во вложенной функции), а не в глобальной области видимости. global же используется для изменения переменных в глобальной области видимости из локальной области видимости функции.

nonlocal и global оба используются для доступа к переменным, находящимся вне текущей области видимости, но у них разные цели и области применения:

global используется для доступа к переменным, находящимся в глобальной области видимости. Глобальная область видимости обычно относится к области видимости модуля. Когда вы объявляете переменную как global внутри функции, вы говорите, что хотите работать с переменной, которая определена на уровне модуля (вне этой функции).

nonlocal используется для доступа к переменным, находящимся во внешней неглобальной области видимости. Это означает, что nonlocal используется внутри вложенной функции (внутренней функции), чтобы изменить переменную, определенную в ближайшей внешней функции (функции, в которой она непосредственно вложена), но не в глобальной области видимости. nonlocal позволяет "подняться" на один уровень вверх по области видимости функций.

Когда использовать nonlocal вместо global:

  • Когда вы находитесь во вложенной функции и хотите изменить переменную во внешней функции, но не глобальную переменную. nonlocal позволяет вам изменять переменные, которые принадлежат замыканию (closure).
  • Когда ваша цель - инкапсуляция состояния. Использование nonlocal помогает сохранить состояние переменной внутри конкретного набора вложенных функций, ограничивая ее видимость и избегая загрязнения глобальной области видимости. Это способствует лучшему контролю над данными и уменьшает риск случайного изменения глобальных переменных.

Пример:


def outer_function():
    x = 10

    def inner_function():
        nonlocal x  # Изменяет x внешней функции
        x = 20
        print("В inner_function:", x)

    inner_function()
    print("В outer_function:", x)

outer_function()

# Вывод:
# В inner_function: 20
# В outer_function: 20
    

В этом примере, если бы мы использовали global x в inner_function, то мы бы попытались изменить глобальную переменную x (если бы такая существовала), а не переменную x в outer_function. Без nonlocal переменная x в inner_function была бы локальной для этой функции, и изменение ее значения не повлияло бы на x в outer_function.

Ключевое различие: global для доступа к глобальным переменным, nonlocal для доступа к переменным во внешней (но не глобальной) области видимости во вложенных функциях.

0