[pyar] La función a la que se le mueve la estantería
Facundo Batista
facundobatista en gmail.com
Vie Jun 7 17:34:16 -03 2019
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.
Ah, ya entendí! Al tratar de responderte a vos, gracias :)
Lo que entendí es: la función al ejecutarse necesita `i` y la va a
buscar según las reglas de siempre: no la tiene definida localmente,
sale afuera, en este caso sólo tiene el global, y encuentra la `i` que
haya.
Dejo este código, que muestra que no es algo de lambda solamente, y
también que refuerza el "i que haya":
```
funcs = []
for i in range(3):
def foo(n):
return n ** i
funcs.append(foo)
i = 9
print(funcs[0](7))
```
Por otro lado, cuando armás un closure, como el siguiente código...
```
funcs = []
for i in range(3):
def bar():
x = i
def foo(n):
return n ** x
return foo
funcs.append(bar())
print(funcs[0](7))
```
...funciona bien porque la func guardada necesita buscar un `x` y ese
x no lo tiene definido localmente, sale a buscarlo afuera, encuentra
el espacio de nombres de `bar`, la cual tiene definida `x` y vale lo
que guardó en su momento (porque para cada foo que guardamos en funcs,
armamos un espacio de nombres de bar ad-hoc).
Que interesante.
Gracias por la ayuda!!
--
. Facundo
Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org.ar/
Twitter: @facundobatista
Más información sobre la lista de distribución pyar