En Python, la palabra clave nonlocal te permite modificar variables de la función externa desde funciones anidadas para gestionar clausuras y estado intermedio.
Esto resulta especialmente útil cuando trabajas con clausuras (closures) y necesitas que la función anidada recuerde y modifique el estado de la función que la contiene, sin recurrir a variables global.
Sintaxis
La sintaxis básica para usar la palabra clave nonlocal es la siguiente:
nonlocal variable_name
Donde variable_name es el nombre de la variable que deseas marcar como no local.
La palabra clave nonlocal solo es válida dentro de funciones anidadas. Usarla a nivel de módulo o dentro de una función que no está anidada en otra provoca un SyntaxError.
Ejemplos prácticos
Veamos un ejemplo para ilustrar cómo funciona nonlocal:
>>> def outer_function():
... value = 10
... def inner_function():
... nonlocal value
... value = 20
... print("Dentro de inner_function:", value)
... inner_function()
... print("Dentro de outer_function:", value)
...
>>> outer_function()
Dentro de inner_function: 20
Dentro de outer_function: 20
En este ejemplo, inner_function() modifica el valor de value declarado en outer_function() gracias a la palabra clave nonlocal. Sin nonlocal, inner_function() trataría value como una nueva variable local.
Un ejemplo más práctico es un contador que mantiene su estado entre llamadas gracias a una clausura:
>>> def make_counter(start=0):
... count = start
... def increment():
... nonlocal count
... count += 1
... return count
... return increment
...
>>> counter = make_counter()
>>> counter()
1
>>> counter()
2
>>> counter()
3
Aquí, make_counter() devuelve la función increment(), que recuerda y modifica count gracias a nonlocal. Cada llamada a counter() incrementa el valor sin necesidad de variables globales ni clases.
A diferencia de global, que permite acceder a variables del ámbito global del módulo, nonlocal solo actúa sobre variables definidas en la función externa. Esto la convierte en una herramienta clave para trabajar con clausuras (closures) y funciones anidadas.
Uso de nonlocal
Los casos de uso más comunes de la palabra clave nonlocal incluyen los siguientes:
- Modificar variables de la función externa sin afectar el ámbito global
- Mantener el estado entre llamadas sucesivas a una función anidada
- Crear clausuras (closures) que recuerdan el estado de la función que las contiene
Resumiendo
La palabra clave nonlocal en Python te permite modificar variables de la función externa desde dentro de funciones anidadas.
Conocer y emplear esta palabra clave te permite controlar mejor el alcance de las variables y crear clausuras y funciones anidadas más flexibles y poderosas.