while statement simple loop jump from for python for-loop lambda

statement - Python lambda no recuerda el argumento en for loop



python loops (3)

Posible duplicado:
Usar valor de variable en expresión lambda

Estoy trabajando con Python y tratando de aislar un problema que tenía con las funciones de lambda.

Desde el siguiente código esperaba crear dos funciones lambda, cada una obteniendo una x diferente, y la salida debería ser
1 2

pero el resultado es 2 2

¿Por qué? ¿Y cómo puedo hacer dos funciones diferentes? Usando def?

def main(): d = {} for x in [1,2]: d[x] = lambda : print(x) d[1]() d[2]() if __name__ == ''__main__'': main()


El cuerpo de la lambda en tu código hace referencia al nombre x . El valor asociado con ese nombre se cambia en la siguiente iteración del ciclo, de modo que cuando se llama a la lambda y resuelve el nombre, obtiene el nuevo valor.

Para lograr el resultado que esperaba, vincule el valor de x en el bucle a un parámetro de la lambda y luego haga referencia a ese parámetro, como se muestra a continuación:

def main(): d = {} for x in [1,2]: d[x] = lambda x=x: print(x) d[1]() d[2]() if __name__ == ''__main__'': main() >>> 1 2


Esto lo arreglará. Es porque la x está directamente ligada a la lambda.

def create_lambda(x): return lambda : print(x) def main(): d = {} for x in [1,2]: d[x] = create_lambda(x) d[1]() d[2]() if __name__ == ''__main__'': main()


Parece trabajo para partial .

from functools import partial def main(): d = {} for x in [1,2]: d[x] = partial(lambda x: print(x), x=x) d[1]() d[2]() if __name__ == ''__main__'': main()