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

lasizoillo lasizoillo en gmail.com
Vie Ago 27 01:23:28 CEST 2010


El día 26 de agosto de 2010 23:42, Txema Vicente <txema en 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


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