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


x = 0

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

print(outer())

Код выведет число 5.

Пояснение:
  • Переменная x объявлена в глобальной области видимости и равна 0.
  • Функция outer содержит вложенную функцию inner.
  • Внутри inner используется ключевое слово nonlocal x, которое указывает, что x является переменной из ближайшей внешней области видимости, не являющейся глобальной. В данном случае, это область видимости функции outer.
  • Функция inner присваивает переменной x значение 5.
  • Функция outer возвращает значение x, которое после вызова inner будет равно 5.
  • Функция print выводит возвращенное значение, то есть 5.

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

Разберем код построчно:

  1. x = 0: Инициализируется глобальная переменная x со значением 0.
  2. def outer():: Определяется внешняя функция outer.
  3. def inner():: Определяется вложенная функция inner внутри outer.
  4. nonlocal x: Внутри inner, ключевое слово nonlocal указывает, что x – это переменная, находящаяся в ближайшей внешней неглобальной области видимости. В данном случае, это переменная x, объявленная во внешней функции outer. Без nonlocal, x = 5 внутри inner создала бы новую локальную переменную x внутри inner, не затрагивая внешнюю переменную.
  5. x = 5: Присваивает переменной x (из внешней функции outer) значение 5.
  6. inner(): Вызывается функция inner, которая изменяет значение x во внешней области видимости outer.
  7. return x: Функция outer возвращает значение переменной x, которое было изменено функцией inner.
  8. print(outer()): Вызывается функция outer, и возвращаемое ею значение (то есть, значение x) выводится на экран.

Результат:

Код выведет на экран число 5.

Пояснение: Благодаря ключевому слову nonlocal, функция inner смогла изменить значение переменной x, объявленной во внешней функции outer. Если бы nonlocal не было использовано, функция inner создала бы свою собственную локальную переменную x, и функция outer вернула бы исходное значение x, то есть 0.

0