Sobes.tech
Назад к вопросам
Junior — Middle
42

Каким образом в Python создается и работает замыкание функции?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Замыкание в Python — это функция, которая запоминает значения из внешней области видимости даже после того, как внешняя функция уже завершила работу. Обычно его используют для инкапсуляции состояния без классов и для создания функций с параметрами-настройками. Важно понимать, что замыкание работает через ссылки на переменные из enclosing scope.

Определение:

Замыкание создается, когда внутренняя функция использует переменные из внешней функции, а затем эта внутренняя функция возвращается наружу или передается дальше. В Python такая функция сохраняет доступ к этим переменным, потому что они входят в ее лексическое окружение.

Проще говоря, если функция «помнит» значения из места, где была создана, это и есть замыкание.

Пример использования:

def make_multiplier(n):
    def multiplier(x):
        return x * n
    return multiplier

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

print(double(5))   # 10
print(triple(5))   # 15

Пояснение кода:

Код нужен, потому что замыкание проще всего понять на примере.

  1. make_multiplier(n) — внешняя функция, которая принимает параметр n.
  2. Внутри нее объявлена функция multiplier(x), которая использует n из внешней области видимости.
  3. make_multiplier возвращает не результат вычисления, а саму внутреннюю функцию.
  4. После вызова double = make_multiplier(2) переменная n со значением 2 сохраняется внутри double.
  5. При вызове double(5) Python берет сохраненное n = 2 и вычисляет 5 * 2.
  6. Аналогично triple(5) использует n = 3.

Ключевые моменты:

  • Замыкание возникает, когда внутренняя функция использует переменные внешней функции.
  • Эти переменные сохраняются даже после завершения внешней функции.
  • Замыкания полезны для хранения состояния без использования классов.
  • Частый кейс — фабрики функций, декораторы, обработчики событий.
  • В Python важно помнить про позднее связывание переменных в циклах, если замыкания создаются внутри цикла.
  • Замыкание — это не просто вложенная функция, а функция с сохраненным лексическим окружением.