Объяснение по шагам
1️⃣Цикл for i in range(3) запускается: i принимает значения 0, 1, 2
2️⃣На каждой итерации создаётся лямбда lambda: i — но она не запоминает текущее значение i, а сохраняет лишь ссылку на имя i
3️⃣Список funcs теперь содержит три функции, каждая смотрит на одно и то же имя i
4️⃣Цикл завершился — переменная i в области видимости равна 2
5️⃣f() вызывается для первой лямбды → ищет i → находит 2 → возвращает 2
6️⃣То же самое для второй и третьей лямбды
7️⃣print([2, 2, 2]) выводит [2, 2, 2]
Почему это важно
Классическая ловушка при создании коллбэков в цикле. Чтобы зафиксировать значение в момент создания, используйте аргумент по умолчанию: lambda i=i: i — он вычисляется сразу при создании функции.
Post #4696
813
- ✍ 4