Вопрос:
Что такое замыкание?
Как часто спрашивают: Очень редко
Кто предложил: 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.
Этот вопрос также показывает, может ли кандидат объяснить, как функция сохраняет состояние без использования глобальной переменной или класса.
Кандидат должен сказать, что замыкание:
- является функцией;
- обращается к переменной из внешней области видимости;
- сохраняет доступ к ней после завершения внешней функции.