Найдите и объясните ошибку в этом Python-коде (ленивые замыкания): "funcs = [lambda: i for i in range(3)]; print([f() for f in funcs])" и предложите исправление

15 Янв в 13:08
12 +1
0
Ответы
1
Ошибка: лямбда-функции захватывают переменную `i` по ссылке, а не её значение во время создания. После цикла `i` равно (3−1)=2(3-1)=2(31)=2, поэтому все функции возвращают одно и то же значение [2,2,2][2,2,2][2,2,2].
Оригинал:
```
funcs = [lambda: i for i in range(3)]
print([f() for f in funcs]) # -> [2,2,2]
```
Исправления (варианты):
1) Использовать значение по умолчанию, оно вычисляется при создании:
```
funcs = [lambda i=i: i for i in range(3)]
print([f() for f in funcs]) # -> [0,1,2]
```
2) Использовать фабрику функций:
```
def make(i):
return lambda: i
funcs = [make(i) for i in range(3)]
print([f() for f in funcs]) # -> [0,1,2]
```
Пояснение коротко: в первом исправлении `i=i` создаёт локальную копию значения при создании лямбды; во втором — каждая лямбда получает свой параметр через замыкание функции `make`.
15 Янв в 13:15
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир