Если речь о функциях, созданных в цикле, причина обычно в позднем связывании замыкания: они читают одну переменную i при вызове, когда цикл уже оставил в ней 3.
Почему во всех вызовах подставляется тройка (значение i=3)?
Если речь о функциях, созданных в цикле, причина обычно в позднем связывании замыкания: они читают одну переменную i при вызове, когда цикл уже оставил в ней 3.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Если речь о функциях, созданных в цикле, причина обычно в позднем связывании замыкания: они читают одну переменную i при вызове, когда цикл уже оставил в ней 3.
functions = [lambda i=i: i for i in range(4)]
[f() for f in functions] # [0, 1, 2, 3]
Аргумент по умолчанию фиксирует текущее значение при создании каждой функции. Альтернатива — фабрика, создающая отдельное замыкание. Без исходного кода это объяснение условное: само число 3 не доказывает механизм ошибки.