Что распечатает данный код

Код выведет четыре строки с числом 6. Все lambda обращаются к одной переменной i из comprehension, которая к моменту их вызова имеет последнее значение 3.

Короткий ответ

Что ответить на собеседовании

Код выведет четыре строки с числом 6. Все lambda обращаются к одной переменной i из comprehension, которая к моменту их вызова имеет последнее значение 3.

Подробный разбор

Ответ с пояснениями

Условие

Что распечатает данный код

def calc(): return [lambda x: i * x for i in range(4)]

for res in calc(): print(res(2))

Ответ

Код выведет четыре строки с числом 6. Все lambda обращаются к одной переменной i из comprehension, которая к моменту их вызова имеет последнее значение 3.

Замыкание сохраняет доступ к переменной, а не снимок её значения на каждой итерации. Когда цикл по результату calc() вызывает функции, построение списка уже завершено. Зафиксировать значение можно параметром по умолчанию:

def calc():
    return [lambda x, i=i: i * x for i in range(4)]

Тогда вызовы с аргументом 2 дадут 0, 2, 4, 6. Альтернатива — отдельная фабрика функции, создающая новое замыкание на каждом шаге.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее