Разбор работы замыканий в Python

Оба вызова напечатают 20. Замыкание читает сохранённую переменную внешней области, а не снимок её значения в момент объявления inner.

Короткий ответ

Что ответить на собеседовании

Оба вызова напечатают 20. Замыкание читает сохранённую переменную внешней области, а не снимок её значения в момент объявления inner.

Подробный разбор

Ответ с пояснениями

Условие

Какой вывод будет у следующего примера? Пример иллюстрирует использование замыкания, когда вложенная функция обращается к переменной из внешней функции.

def outer():
    value = 10
    def inner():
        return value
    value = 20
    return inner

closure = outer()
print(closure())
print(closure())

Ответ

Оба вызова напечатают 20. Замыкание читает сохранённую переменную внешней области, а не снимок её значения в момент объявления inner.

inner обращается к value из outer. До возврата вложенной функции внешняя переменная переприсваивается с 10 на 20, и именно это значение остаётся доступным через замыкание.

20
20

Функция inner ничего не изменяет, поэтому повторный вызов даёт тот же результат. Если нужен снимок первоначального значения, его можно зафиксировать аргументом по умолчанию def inner(value=value): ... до переприсваивания. Это другой механизм: default вычисляется при определении функции, тогда как свободная переменная читается при вызове.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее