Выбор ответа Senior Функции и области видимости обновлено

Где хранятся переменные замыкания

Вопрос

Где CPython хранит переменные внешней функции, которые использует вложенная функция после завершения внешней?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: В ячейках (cell), на которые ссылается closure. Переменные, которые захватывают вложенные функции, компилятор делает «ячейковыми»: значение лежит в объекте cell, общем для внешней и внутренней функций. inner.closure хранит кортеж этих ячеек, а inner.code.cofreevars их имена.

Варианты ответа

  1. В глобальном словаре модуля под скрытым именем
  2. Копия значений сохраняется в __defaults__ функции
  3. В ячейках (cell), на которые ссылается __closure__правильный ответ
  4. В кадре стека внешней функции, который никогда не удаляется

Разбор

Переменные, которые захватывают вложенные функции, компилятор делает «ячейковыми»: значение лежит в объекте cell, общем для внешней и внутренней функций. inner.__closure__ хранит кортеж этих ячеек, а inner.__code__.co_freevars их имена. Кадр внешней функции после возврата освобождается, глобальный словарь не трогается, а __defaults__ хранит лишь значения по умолчанию. Через ячейки работает и nonlocal, и позднее связывание.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.