Назад

Вопрос:

Что такое замыкание?

Как часто спрашивают: Очень редко

Кто предложил: ALittleMoron


Ответ:

Замыкание представляет собой вложенную функцию, сохраняющую контекст внешней функции даже после её завершения выполнения.

def make_multiplier(factor):
    def multiply(value):
        return value * factor
    return multiply


double = make_multiplier(2)
triple = make_multiplier(3)

print(double(10))  # 20
print(triple(10))  # 30

Функция multiply является замыканием, потому что:

  • она определена внутри make_multiplier;
  • использует переменную factor из внешней функции;
  • продолжает иметь доступ к factor после завершения make_multiplier.

Каждый вызов make_multiplier создаёт отдельное окружение: double хранит доступ к factor = 2, а triple — к factor = 3.

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


Объяснение ответа на собеседовании:

Интервьюер проверяет, понимает ли кандидат:

  • области видимости переменных;
  • вложенные функции;
  • лексическую область видимости;
  • время жизни переменных;
  • функции как объекты первого класса;
  • устройство декораторов и фабрик функций;
  • позднее связывание переменных в Python.

Этот вопрос также показывает, может ли кандидат объяснить, как функция сохраняет состояние без использования глобальной переменной или класса.

Кандидат должен сказать, что замыкание:

  • является функцией;
  • обращается к переменной из внешней области видимости;
  • сохраняет доступ к ней после завершения внешней функции.

Внешние ресурсы: