[Python-es] Duda con los parametros de funciones lambda.

Arnau Sanchez pyarnau en gmail.com
Vie Ago 27 01:35:00 CEST 2010


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


Más información sobre la lista de distribución Python-es