Sobes.tech
Назад к вопросам
Middle
227
questionbank

Как работают операторы 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 не стоит: чаще лучше явно передавать значения и возвращать результат.