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 queinterior()
puede utilizar cualquiera de las entidades a disposición deexterior()
. - La función
exterior()
devuelve la funcióninterior()
por si misma; mejor dicho, devuelve una copia de la funcióninterior()
al momento de la invocación de la funciónexterior()
; la función congelada contiene su entorno completo, incluido el estado de todas las variables locales, lo que también significa que el valor deloc
se retiene con éxito, aunqueexterior()
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.