¿Qué imprime esto?
fns = [lambda: i for i in range(3)]
print([f() for f in fns])Opciones
- [0, 1, 2]
- [2, 2, 2] (Opción correcta)
- [3, 3, 3]
- NameError
Respuesta
[2, 2, 2]
Por qué
Cada lambda NO guarda el valor de i al crearse. Guarda un enlace a la variable i y la lee más tarde, cuando se la llama (esto se llama late binding).
Cuando llamamos a las lambdas, el bucle ya terminó e i vale 2, así que todas devuelven 2.
Solución: captura el valor actual como argumento por defecto, que se evalúa de inmediato.
fns = [lambda i=i: i for i in range(3)] # [0, 1, 2]Recuerda
Los closures recuerdan variables, no valores.