Как работают операторы global и nonlocal в Python?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
global и nonlocal нужны, чтобы внутри функции изменить переменную не в локальной области видимости, а во внешней. global работает с переменной уровня модуля, nonlocal — с переменной из ближайшей внешней функции. Их обычно используют осторожно, потому что они делают код менее предсказуемым.
Определение:
В Python имена внутри функции по умолчанию считаются локальными, если им присваивается значение. Оператор global говорит интерпретатору, что имя нужно брать из глобальной области видимости модуля, а не создавать локальное. Оператор nonlocal указывает на переменную из ближайшей внешней функции, что особенно важно в замыканиях.
Пример использования:
x = 10
def change_global():
global x
x = 20
def outer():
y = 5
def inner():
nonlocal y
y = 15
return y
result = inner()
return y, result
change_global()
print(x) # 20
print(outer()) # (15, 15)
Пояснение кода:
В примере x объявлена на уровне модуля. В функции change_global() оператор global x связывает имя x с этой глобальной переменной, поэтому присваивание меняет именно её, а не создаёт новую локальную.
В функции outer() есть локальная переменная y. Вложенная функция inner() использует nonlocal y, чтобы обратиться к переменной y из ближайшей внешней функции outer(). После присваивания y = 15 значение сохраняется в outer(), а не в inner().
Если бы nonlocal убрать, то y = 15 внутри inner() создало бы новую локальную переменную y, и внешняя y не изменилась бы.
Ключевые моменты:
globalнужен для изменения переменной на уровне модуля изнутри функции.nonlocalнужен для изменения переменной из ближайшей внешней функции.- Без этих операторов присваивание внутри функции создаёт локальную переменную.
nonlocalработает только во вложенных функциях и не может ссылаться на глобальную область.- Злоупотреблять
globalиnonlocalне стоит: чаще лучше явно передавать значения и возвращать результат.