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()