es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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)
Tags:  ,

Answer

  1. Avatar for 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 devolviendo func_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 lista cache que fue definida en wrapper 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ón wrapper. Sin embargo, dado que wrapper devuelve func_new, el cual tiene acceso a la lista cache debido a los closures, cuando se llama x = wrapper(add1), ahora x se refiere a func_new, que tiene acceso a la lista cache.

    Por último, la instrucción print(cache) fuera de wrapper y func_new genera un NameError ya que cache no está definida en el alcance global. Solo se puede acceder a ella dentro del alcance de wrapper y func_new.

Comments are closed.