On Thu, 26 Aug 2010 23:42:58 +0200 Txema Vicente wrote: > # Tercera forma > for b in (7,8,9): funciones.append(lambda x: multiplica(b ,x)) > > # Resultado > for funcion in funciones: print str(funcion(10)) > > La salida que esperaba era : > 10, 20, 30, 40, 50, 60, 70, 80, 90 > > Pero salida es: > 10, 20, 30, 60, 60, 60, 90, 90, 90
Una variable utilizada, pero no definida, en una función/lambda anidada se sustituye por su valor en el momento de ejecución, no de definición. En este ejemplo se ve claro: >>> a = 1 >>> f = lambda: a >>> f() 1 >>> a = 2 >>> f() 2 Una solución pasa por usar otra lambda auxiliar: for b in (7,8,9): funciones.append((lambda b: lambda x: multiplica(b, x))(b)) Pero como esto es feo, la gente suele hacelo de otra forma, pasando la variable como argumento: for b in (7,8,9): funciones.append(lambda x, b=b: multiplica(b, x)) Pero por otro lado, lo que estás haciendo no es ni más ni menos que una función parcial de toda la vida (omnipresente en los lenguajes funcionales). Así que la mejor solución diría que es: import functools for b in (7,8,9): funciones.append(functools.partial(multiplica, b)) _______________________________________________ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/