Короткий ответ
global позволяет изменять внутри функции переменную уровня модуля, а nonlocal — переменную из ближайшей объемлющей функции во вложенных функциях. Без этих ключевых слов присваивание создало бы новую локальную переменную, а не изменило внешнюю.
Как это работает подробнее
Оба ключевых слова расширяют область видимости, в которой происходит присваивание.
- Ключевое слово global. Указывает, что имя относится к уровню модуля, поэтому присваивание меняет глобальную переменную, а не создаёт новую локальную.
- Ошибка без global. Строка вроде
count += 1безglobalвоспринимается как работа с локальной переменной и вызываетUnboundLocalError. - Ключевое слово nonlocal. Во вложенной функции ссылается на переменную ближайшей внешней функции, то есть на область между локальной и глобальной.
- Связь с замыканиями. Механизм позволяет вложенным функциям менять состояние внешней функции, что используется в счётчиках и замыканиях.
Пример кода
global и nonlocal
count = 0
def increment():
global count
count += 1
increment()
print(count) # 1
def outer():
x = 10
def inner():
nonlocal x
x += 5
inner()
print(x) # 15
outer()Что использовать на практике
- Счётчики и состояние. Для накопления состояния во вложенных функциях применяй
nonlocal, для модульных счётчиков —global. - Умеренность. Изменение внешнего состояния усложняет код: чаще передавай значения через параметры и возвращай результат.
- Чтение чужого кода. Понимание этих ключевых слов необходимо при разборе кода с замыканиями, счётчиками и вложенными функциями.