Что выведет этот код?


x = 2

def outer():
    def inner():
        nonlocal x
        x = 3
    inner()
    return x

print(outer())

Код выведет 3. Объяснение:
  • x = 2: Глобальная переменная x инициализируется значением 2.
  • outer(): Вызывается внешняя функция.
  • inner(): Внутри outer() вызывается вложенная функция inner().
  • nonlocal x: Объявление в inner() указывает, что x относится к переменной из ближайшей неглобальной области видимости, то есть к переменной x в outer().
  • x = 3: В inner() переменная x (из области видимости outer()) изменяется на 3.
  • return x: outer() возвращает значение x, которое равно 3.
  • print(outer()): Выводится возвращенное значение, то есть 3.

Разбор задачи:

Данный код иллюстрирует использование ключевого слова nonlocal в Python.

Порядок выполнения:

  1. x = 2: Переменная x инициализируется значением 2 в глобальной области видимости.
  2. outer(): Вызывается функция outer.
  3. Внутри outer():
    • Функция inner() определена.
    • Вызывается функция inner().
    • Внутри inner():
      • nonlocal x: Указывает, что переменная x, используемая внутри inner(), находится в ближайшей внешней (не глобальной) области видимости. В данном случае, это область видимости функции outer().
      • x = 3: Переменной x в области видимости outer() присваивается значение 3. Важно! Эта операция не затрагивает глобальную переменную x.
    • inner() завершается.
    • return x: Функция outer() возвращает значение переменной x, которое теперь равно 3 (так как оно было изменено в inner()).
  4. print(outer()): Выводит возвращаемое значение outer(), которое равно 3.

Ключевые моменты:

  • nonlocal: Позволяет внутренней функции изменять переменную, объявленную в ближайшей внешней (не глобальной) области видимости.
  • Без nonlocal, попытка присвоить значение x в inner() создала бы локальную переменную x внутри inner(), не затрагивая x в outer().
  • Если бы переменная x не была определена во внешней области видимости функции inner (т.е. если бы не было строчки `x = 2` и `x = 3` в `outer`), то возникла бы ошибка NameError.

Вывод:

Программа выведет число 3.

0