Repaso
English
PythonAvanzadoPY-03

¿Qué imprime esto?

fns = [lambda: i for i in range(3)]
print([f() for f in fns])

Opciones

  1. [0, 1, 2]
  2. [2, 2, 2] (Opción correcta)
  3. [3, 3, 3]
  4. 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.

Términos clave

Practica esta pregunta en Repaso