Код выведет четыре строки с числом 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. Альтернатива — отдельная фабрика функции, создающая новое замыкание на каждом шаге.