[pyar] Funciones lambdas dentro de for

fisa fisadev en gmail.com
Mie Sep 24 13:15:42 ART 2014


Eso mismo que explicó Darni con el ejemplo.
La *definición* de la función se ejecuta en el momento del append.
Pero el valor de i no se consulta al definir la función, sino al
llamarla, como en el ejemplo que te puso.

El día 24 de septiembre de 2014, 12:55, Daniel Moisset
<dmoisset en machinalis.com> escribió:
> A ver, la funcion lambda se crea en cada vuelta del for, pero no importa,
> porque lo que importa es que sucede cuando haces la llamada. Tu situacion es
> muy muy parecida a esto:
>
> i = 1
> def funcion():
>     print i
> i = 2
> i = 3
> funcion()
>
> el programa este imprime "3". si bien la funcion se definio cuando i era 1,
> el valor de i es 3 en el momento en que se *invoca* la función. Y el codigo
> de la funcion lo que dice es "ok, busquemos el valor actual de la global i.
> ok, y ahora lo mostramos en la pantalla". El *valor* de i no se usa nunca
> para definir la funcion.
>
> Lo mismo pasa en tu codigo, pero en vez de un "def ..." es un "lambda..."
>
> Saludos,
>    D.
>
>
>
> 2014-09-24 12:49 GMT-03:00 Manuel Kaufmann <humitos en gmail.com>:
>
>> 2014-09-24 12:41 GMT-03:00 Daniel Moisset <dmoisset en machinalis.com>:
>> > porque i es una sola variable (en tu caso gloabl), entonces la funcion
>> > siempre accede a la misma variable que tiene 3.
>>
>> Entonces, ¿la definición la función anónima lambda no se hace al
>> momento de ejecutar el .append()? Eso es lo que no me cierra.
>>
>> Entiendo que "i" al salir del for sea 3, pero si la función anónima se
>> definiría dentro del for, para mí debería funcionar como yo espero.
>> Ahora bien, si me dicen que la función se define al momento de hacer
>> functions[0](55) es otro cantar.
>>
>> Pero, haciendo unas pruebas veo que "se define al momento de ser llamada"
>>
>> >>> functions = []
>> >>> for i in (1,2,3):
>> ...   functions.append(lambda d: mifunc(i, d))
>> ...
>> >>> functions[0](55)
>> 3 55
>> >>> i = 44
>> >>> functions[0](55)
>> 44 55
>> >>>
>>
>> ¡Ahí está el pelo del huevo!
>>
>> > Una forma de lograr lo que queres es capturar la variable i en una
>> > variable
>> > local del lambda:
>>
>> > In [7]: for i in (1,2,3):
>> >    ...:     functions.append(lambda d, i=i: mifunc(i, d))
>>
>> Che, gracias. Esto funciona de lujo. Sin embargo, no estoy pudiendo
>> entender el porqué.
>>
>>
>> --
>> Kaufmann Manuel
>> -- http://elblogdehumitos.com.ar
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>
>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar



-- 
fisa  -  Juan Pedro Fisanotti


More information about the pyar mailing list