El día 26 de agosto de 2010 23:42, Txema Vicente <tx...@nabla.net> escribió: > Buenas. > > Tengo un problemilla con las funciones lambda, quiero generar un monton de > ellas desde un bucle, pero me he topado con que si hago esto: > > def multiplica(n,m): return n*m > > funciones=[] > > # Primera forma > funciones.append(lambda x: multiplica(1 ,x)) > funciones.append(lambda x: multiplica(2 ,x)) > funciones.append(lambda x: multiplica(3 ,x)) > > # Segunda forma > a=4 > funciones.append(lambda x: multiplica(a ,x)) > a=5 > funciones.append(lambda x: multiplica(a ,x)) > a=6 > funciones.append(lambda x: multiplica(a ,x)) > > # 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 > > Por lo visto se queda con el ultimo valor que tiene "a" o "b". > Vale: se pasan por referencia, pero yo quiero el valor. > > Como se puede sacar el valor para hacer que la tercera forma funcione? > > Saludos >
Has pensado en usar lo siguiente: from functools import partial def multiplica(n,m): return n*m funciones=[] funciones.append(partial(multiplica, 1)) http://docs.python.org/library/functools.html#functools.partial De todas formas, si sigues empeñado en usar lambda: In [12]: for b in (7,8,9): funciones.append(lambda x, b=b:multiplica(b ,x)) ....: In [13]: for funcion in funciones: print str(funcion(10)) ....: 10 20 30 40 50 60 70 80 90 Un saludo: Javi _______________________________________________ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/