Comprender cómo se comporta una variable según el lugar donde se define es fundamental para escribir código limpio y libre de errores en Python. El alcance (scope) de una variable determina desde qué partes del programa puedes leer o modificar su valor, y dominarlo te evitará bugs difíciles de rastrear.
¿Qué diferencia hay entre una variable local y una variable global?
Una variable local es aquella que se crea dentro de una función y solo existe mientras esa función se ejecuta [0:30]. Al intentar acceder a ella fuera del cuerpo de la función, Python lanza un error indicando que la variable no está definida [1:25].
python
def mi_funcion():
x = 10 # variable local
print(f"El valor de la variable es {x}")
mi_funcion()
print(x) # NameError: name 'x' is not defined
Una variable global, en cambio, se declara en el primer nivel de indentación del archivo. Esto significa que cualquier función puede leer su valor sin necesidad de recibirlo como parámetro [2:15].
python
x = 100 # variable global
def mostrar_global():
print(f"El valor de la variable global es {x}")
mostrar_global()
print(x) # 100
La clave está en la indentación: el nivel en el que defines una variable determina su persistencia y visibilidad dentro del código.
¿Qué sucede cuando una función contiene otra función?
Python permite definir una función dentro de otra, lo que se conoce como inner function o función interna [3:30]. Al hacerlo, cada nivel de anidación puede tener su propia versión de la misma variable, y el valor que se imprime depende del alcance en el que te encuentres.
python
x = "global"
def funcion_externa():
x = "encapsulada"
def funcion_interna(): x ="local"print(x) # local
funcion_interna()print(x) # encapsulada
funcion_externa()
print(x) # global
Al ejecutar este código [5:10]:
Primero se imprime local, porque la función interna asigna su propio valor.
Después se imprime encapsulada, ya que al salir de la función interna se recupera el valor del nivel intermedio.
Finalmente se imprime global, el valor que persiste en todo el archivo.
Este comportamiento demuestra que cada nivel de indentación crea su propio espacio de nombres.
¿Cómo modificar una variable global o encapsulada desde una función?
¿Para qué sirve la palabra reservada global?
Cuando necesitas que una función no solo lea, sino que modifique el valor de una variable global, debes declararla explícitamente con la palabra reservada global [6:05].
python
x = 5 # variable global
def cambiar_valor():
global x
x = x + 3
print(f"Valor modificado: {x}")
cambiar_valor() # Valor modificado: 8
print(x) # 8
Sin la instrucción global x, Python crearía una variable local nueva en lugar de alterar la original. Al usarla, el cambio se refleja tanto dentro como fuera de la función [7:00].
¿Cuándo se utiliza nonlocal?
Existe un escenario intermedio: una variable que no es local ni global, sino que pertenece a una función envolvente. Para modificarla desde la función interna se emplea la palabra reservada nonlocal [7:50].
python
def funcion_envolvente():
x = "encapsulada"
def funcion_interna(): nonlocal x
x ="valor modificado"print(f"El valor en inner es {x}")funcion_interna()print(f"El valor afuera es {x}")
funcion_envolvente()
Al ejecutar [9:10]:
Dentro de la función interna, x cambia a "valor modificado".
Al salir al cuerpo de la función envolvente, el valor ya fue actualizado gracias a nonlocal.
Esto resulta útil cuando trabajas con closures o patrones donde funciones anidadas necesitan compartir estado sin recurrir a variables globales.
¿Cómo practicar estos conceptos?
Se propone un reto [10:10]: crear dos funciones que trabajen con un diccionario de empleados con las claves nombre, edad y salario.
La primera función recibe la información del diccionario.
La segunda analiza el salario y filtra empleados que superen cierto monto.
Debes aplicar correctamente variables locales y globales para gestionar los datos.
Prueba distintas combinaciones de global y nonlocal para ver cómo cambia el comportamiento del programa y comparte tu solución en los comentarios.