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/

Responder a