Оба вызова напечатают 20. Замыкание читает сохранённую переменную внешней области, а не снимок её значения в момент объявления inner.
Разбор работы замыканий в Python
Оба вызова напечатают 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 вычисляется при определении функции, тогда как свободная переменная читается при вызове.