Найдите и объясните ошибку в этом Python-коде (ленивые замыкания): "funcs = [lambda: i for i in range(3)]; print([f() for f in funcs])" и предложите исправление
Ошибка: лямбда-функции захватывают переменную `i` по ссылке, а не её значение во время создания. После цикла `i` равно (3−1)=2(3-1)=2(3−1)=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`.
Оригинал:
```
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`.