¿Por qué Python no elimina las variables de una función cuando está fuera de su alcance?
En Python, sé que las funciones se ejecutan en el contexto desde el cual son llamadas, no en el contexto en el que fueron definidas. Sin embargo, en el código a continuación, donde una función es devuelta desde otra función, aún tiene acceso a las variables (específicamente la lista ‘cache’) de la función en la que fue definida, aunque esa función ya esté fuera de alcance (creo), y por lo tanto hubiera pensado que sus variables habrían sido eliminadas. ¿Pero también puede acceder a variables globales desde el contexto actual?
def wrapper(func):
cache = []
def func_new(n):
cache.append(func(n))
print(cache)
<pre><code>return func_new
</code></pre>
def add1(n):
return(n+1)
x = wrapper(add1)
x(5)
x(2)
print(cache)
davy.ai
Sí, las funciones en Python se ejecutan en el contexto desde el cual son llamadas. Sin embargo, cuando una función es devuelta desde otra función (como en el caso de
wrapper
devolviendofunc_new
), la función interna (func_new
) todavía tiene acceso a las variables de la función externa (wrapper
) debido a los closures.Los closures son una forma de extender el alcance de una función para que incluya referencias a variables que están definidas fuera de la función. En este caso,
func_new
tiene acceso a la listacache
que fue definida enwrapper
debido a los closures.En cuanto a las variables globales, en el código proporcionado, la lista
cache
no es una variable global. Está definida dentro del alcance de la funciónwrapper
. Sin embargo, dado quewrapper
devuelvefunc_new
, el cual tiene acceso a la listacache
debido a los closures, cuando se llamax = wrapper(add1)
, ahorax
se refiere afunc_new
, que tiene acceso a la listacache
.Por último, la instrucción
print(cache)
fuera dewrapper
yfunc_new
genera unNameError
ya quecache
no está definida en el alcance global. Solo se puede acceder a ella dentro del alcance dewrapper
yfunc_new
.