[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