[pyar] La función a la que se le mueve la estantería

Federico Gonzalez federicogonzalez761 en gmail.com
Vie Jun 7 17:16:28 -03 2019


correcciones ( :) ):
- al final es "su segundo" en lugar de "si segundo"
- me falto poner el funcs = [] antes de los "for i in range(3)"

El vie., 7 de jun. de 2019 a la(s) 17:13, Federico Gonzalez (
federicogonzalez761 en gmail.com) escribió:

>
> Mirando en detalle lo que te diría es que una lambda guarda una copia de i
> como su propia variable o la otro usa una referencia que tiene del contexto.
> Si lo escribimos de otra manera:
>
> >>> funcs = [lambda n: n ** i for i in range(3)]
> es lo mismo que:
> >>> for i in range(3):
> >>>     funcs.append(lambda n: n ** i)
>
> Es decir la i que usa la lambda es la i del for, por ende para todas las
> funciones termina teniendo el mismo valor (2).
>
> En cambio:
> >>> funcs = [lambda n, i=i: n ** i for i in range(3)]
>
> es lo mismo que:
>
> >>> for i in range(3):
> >>>     funcs.append(lambda n, i=i: n ** i)
>
> En donde cada lambda tiene una variable i que es igual al valor de la
> variable i del for en ese momento, por ende cada lambda queda seria una
> función con parámetros (serian (n, i = 0), (n, i = 1), (n, i = 2)).
>
> En resumen, la primer lambda tiene un solo parámetro (n) y la segunda
> tiene 2 (n, i) y si segundo parámetro tiene como default el valor de la i
> del for en el momento de crear la lambda.
>
>
> El vie., 7 de jun. de 2019 a la(s) 16:56, Facundo Batista (
> facundobatista en gmail.com) escribió:
>
>> Hola!
>>
>> Este efecto es conocido:
>>
>> >>> funcs = [lambda n: n ** i for i in range(3)]
>> >>> funcs[0](7)
>> 49
>>
>> Sé como solucionarlo:
>>
>> >>> funcs = [lambda n, i=i: n ** i for i in range(3)]
>> >>> funcs[0](7)
>> 1
>>
>> Pero me interesa escarbar un poquito en por qué sucede. Alguien sabe?
>> Idea de por dónde buscar?
>>
>> Gracias! Saludos,
>>
>> --
>> .    Facundo
>>
>> Blog: http://www.taniquetil.com.ar/plog/
>> PyAr: http://www.python.org.ar/
>> Twitter: @facundobatista
>> _______________________________________________
>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>> Sitio web: http://www.python.org.ar/
>>
>> Para administrar la lista (o desuscribirse) entrar a
>> http://listas.python.org.ar/listinfo/pyar
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20190607/6bed0d5d/attachment.html>


Más información sobre la lista de distribución pyar