Python lambda no recuerda el argumento en el bucle for

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