Module (70%)
Section (73%)

Una breve explicación de cierres

Comencemos con una definición: cierres es una técnica que permite almacenar valores a pesar de que el contexto en el que se crearon ya no existe.. ¿Complicado? Un poco.

Analicemos un ejemplo simple:

def exterior(par): loc = par var = 1 exterior(var) print(var) print(loc)

El ejemplo es obviamente erróneo.

Las dos últimas líneas provocarán una excepción NameError - ni par ni loc son accesibles fuera de la función. Ambas variables existen cuando y solo cuando la función exterior() esta siendo ejecutada.


Mira el ejemplo en el editor. Hemos modificado el código significativamente.

Hay un elemento completamente nuevo - una función (llamada interior) dentro de otra función (llamada exterior).

¿Como funciona? Como cualquier otra función excepto por el hecho de que interior() solo se puede invocar desde dentro de exterior(). Podemos decir que interior() es una herramienta privada de exterior(), ninguna otra parte del código la puede acceder.

Observa cuidadosamente:

  • La función interior() devuelve el valor de la variable accesible dentro de su alcance, ya que interior() puede utilizar cualquiera de las entidades a disposición de exterior().
  • La función exterior() devuelve la función interior() por si misma; mejor dicho, devuelve una copia de la función interior() al momento de la invocación de la función exterior(); la función congelada contiene su entorno completo, incluido el estado de todas las variables locales, lo que también significa que el valor de loc se retiene con éxito, aunque exterior() ya ha dejado de existir.

En efecto, el código es totalmente válido y genera:

1

La función devuelta durante la invocación de exterior() es un cierre.



Code

def exterior(par):
loc = par
def interior():
return loc
return interior

var = 1
fun = exterior(var)
print(fun())
{{ dockerServerErrorMsg }} ×
{{ errorMsg }} ×
{{ successMsg }} ×