global и nonlocal — оба ключевых слова позволяют внутренним функциям модифицировать переменные из внешних областей видимости, но они работают на разных уровнях.
globalglobal привязывает переменную внутри функции напрямую к области видимости уровня модуля (глобальной).
Без него присваивание переменной внутри функции создаёт новую локальную переменную вместо модификации глобальной.
count = 0
def increment():
global count
count += 1 # модифицирует глобальную переменную
nonlocalnonlocal привязывает переменную к ближайшей внешней области видимости, которая не является глобальной — обычно используется внутри вложенных функций.
def outer():
count = 0
def inner():
nonlocal count
count += 1 # модифицирует переменную outer()
inner()
return count # возвращает 1
global работает с переменными уровня модуляnonlocal работает с переменными внешней функции, но никогда с глобальнымиnonlocal требует, чтобы переменная уже существовала во внешней области видимости; global может ссылаться на переменную, которой ещё нетglobal с осторожностью — опора на глобальное состояние затрудняет тестирование и поддержку кодаnonlocal при реализации замыканий или вложенных функций с состоянием, например счётчиков или декораторовdef make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
В целом, оба ключевых слова следует использовать осторожно — злоупотребление ими может привести к коду, который сложно анализировать.
Ключевое слово global позволяет внутренней функции модифицировать переменные из области видимости уровня модуля, а nonlocal позволяет модифицировать переменные из ближайшей охватывающей области видимости функции.
Новый — ещё не проверен сообществом
Вы