Posible duplicado:
Usa el valor de la variable en la expresión lambda
Estoy trabajando con python y tratando de aislar un problema que tuve con las funciones 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 la salida 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 su código hace referencia al nombre x
. El valor asociado con ese nombre se cambia en la siguiente iteración del bucle, de modo que cuando se llama a 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
Parece trabajo 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()
Esto lo arreglará. Es porque la x está directamente vinculada 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()