2012-10-11 17 views

Respuesta

5

Se puede utilizar un parámetro con un valor por defecto en la lambda:

for i in range(0, 2): 
    items.append(lambda i=i: dump(i)) 

Esto funciona porque el valor predeterminado se evalúa cuando se define la función, no cuando se llama.

+0

hombre, que son inteligentes. Este fue un ejemplo pero encontraste una solución, el punto era cómo evaluar esa referencia en la definición de lambda. ¿Hay alguna manera de hacer eso? – bradojevic

4

que puede utilizar:

for i in range(0, 2): 
    items.append(lambda i=i: dump(i)) 

para capturar el valor actual de i

Esto funciona porque los valores de los parámetros por defecto son evaluados durante la creación de la función, y i no es la variable externa, sino una función parámetro que tendrá el valor que desea como predeterminado.

Una explicación más detallada se puede encontrar en este answer.

0

El valor de salida es el valor de i en la evaluación de la función, no en su declaración. Es por eso que no obtienes el resultado deseado.

1

Para completar, también se puede hacer:

for i in range(0, 2): 
    items.append((lambda i: lambda: dump(i))(i)) 
+0

Creo que esta respuesta es la menos hacky, a pesar de que es más detallada que la respuesta del valor predeterminado. – max