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