Где хранятся переменные замыкания
Вопрос
Где CPython хранит переменные внешней функции, которые использует вложенная функция после завершения внешней?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- В глобальном словаре модуля под скрытым именем
- Копия значений сохраняется в
__defaults__функции - В ячейках (cell), на которые ссылается
__closure__правильный ответ - В кадре стека внешней функции, который никогда не удаляется
Разбор
Переменные, которые захватывают вложенные функции, компилятор делает «ячейковыми»: значение лежит в объекте cell, общем для внешней и внутренней функций. inner.__closure__ хранит кортеж этих ячеек, а inner.__code__.co_freevars их имена. Кадр внешней функции после возврата освобождается, глобальный словарь не трогается, а __defaults__ хранит лишь значения по умолчанию. Через ячейки работает и nonlocal, и позднее связывание.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Как передаются аргументы в функцию Python
Следующий вопрос
Вызов с *args и **kwargs: разбор сигнатуры