[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