Почему во всех вызовах подставляется тройка (значение 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 не доказывает механизм ошибки.

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

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

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

Подробнее