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

Federico Gonzalez federicogonzalez761 en gmail.com
Vie Jun 7 17:13:24 -03 2019


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/7559cb83/attachment.html>


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