nonlocal
предназначено для доступа и модификации переменных из ближайшей неглобальной области видимости, окружающей текущую функцию. Глобальная область видимости по определению является самой внешней, и нет "объемлющей" неглобальной области видимости, в которой бы переменная существовала для модификации через nonlocal
. Использование global
предназначено для работы с глобальными переменными.
Оператор nonlocal
в Python предназначен для работы с переменными, которые находятся в замкнутых (enclosing) областях видимости, но не являются локальными для текущей функции и не являются глобальными.
Причина, по которой nonlocal
не работает с глобальными переменными, кроется в самой идее его предназначения. nonlocal
создан для того, чтобы позволить функции изменять переменные во внешней (замкнутой), но все еще не глобальной области видимости. Это необходимо, когда вы имеете вложенные функции, и внутренняя функция хочет изменить переменную, определенную во внешней функции, но при этом не создает локальную переменную с тем же именем.
Глобальные переменные уже имеют прямой доступ и могут быть изменены напрямую внутри любой функции с использованием ключевого слова global
. Использование global
явно указывает, что мы намереваемся работать с переменной, определенной в глобальной области видимости. nonlocal
предназначен для другого сценария - для случаев, когда переменная находится "между" локальной и глобальной областями видимости.
Если бы nonlocal
работал с глобальными переменными, это создавало бы путаницу и дублирование функциональности с global
. Более того, это могло бы привести к непредсказуемому поведению, так как было бы неясно, должно ли изменение, сделанное с помощью nonlocal
, быть связано с глобальной переменной напрямую или с переменной во внешней области видимости (если она существует).
В итоге, разделение global
и nonlocal
делает код более явным, понятным и позволяет избежать конфликтов и неоднозначностей при работе с переменными в различных областях видимости.
Пример:
def outer_function():
x = 10
def inner_function():
nonlocal x # Корректно: x находится в замкнутой области видимости outer_function
x = 20
print("inner:", x)
inner_function()
print("outer:", x)
outer_function()
# А вот это вызовет ошибку:
# global_var = 5
# def my_function():
# nonlocal global_var # SyntaxError: no binding for nonlocal 'global_var' found
# global_var = 10
# my_function()
global_var = 5
def my_function():
global global_var
global_var = 10
my_function()
print(global_var) # Output: 10