🌍 Variables locales y globales (Escopo en Python)

💡 ¿Qué es el escopo (scope)?

El escopo define la región del código en donde una variable existe y puede ser usada.
Fuera de esa región, la variable simplemente no existe ⚠️

🧩 Variables locales

Veamos este ejemplo 👇

def saludar():
    mensaje = "Hola"
    print(mensaje)

saludar()
print(mensaje)  # ❌ Error

⬇️ Salida esperada:

Hola
NameError: name 'mensaje' is not defined

🧠 La variable mensaje fue creada dentro de la función saludar(). Por eso solo existe dentro de esa función.

🧠 ¿Qué significa “local”?

Las variables que se crean dentro de una función se llaman variables locales. Solo viven durante la ejecución de esa función 🕒

Cuando la función termina, Python libera su memoria (esto se conoce como garbage collection).

💬 Fuera de la función, esas variables ya no existen.

📦 Parámetros también son locales

Los parámetros funcionan igual que las variables locales 👇

def saludar(nombre):
    print(f"Hola, {nombre}")

saludar("Danna")
print(nombre)  # ❌ Error

⬇️ Salida:

Hola, Danna
NameError: name 'nombre' is not defined

El parámetro nombre solo vive dentro de la función saludar.

🧱 Variables locales con el mismo nombre

Podemos tener diferentes funciones con variables o parámetros que se llamen igual, pero son independientes 👇

def saludar():
    mensaje = "Hola"
    print(mensaje)

def enviar_email():
    mensaje = "Correo enviado"
    print(mensaje)

saludar()
enviar_email()

⬇️ Salida:

Hola
Correo enviado

🧩 Ambas funciones tienen su propia variable mensaje. Son diferentes aunque se llamen igual.

🌐 Variables globales

Si una variable se define fuera de cualquier función, se convierte en una variable global 🌎

mensaje = "Hola desde el mundo global"

def saludar():
    print(mensaje)

saludar()
print(mensaje)

⬇️ Salida:

Hola desde el mundo global
Hola desde el mundo global

💬 Una variable global puede ser usada desde cualquier lugar del archivo.

⚠️ Cuidado: sombreado de variables

Veamos qué pasa si dentro de la función usamos una variable con el mismo nombre 👇

mensaje = "a"

def saludar():
    mensaje = "b"
    print(mensaje)

saludar()
print(mensaje)

⬇️ Salida:

b
a

🤔 ¿Por qué el valor global no cambió? Porque mensaje dentro de la función es otra variable local distinta.

🧩 El error del global

Algunos tutoriales enseñan a usar la palabra clave global para modificar una variable global 👇

mensaje = "a"

def saludar():
    global mensaje      # ⚠️ ¡Mala práctica!
    mensaje = "b"

saludar()
print(mensaje)

⬇️ Salida:

b

⚠️ Esto sí modifica la variable global, pero puede generar efectos colaterales en otras funciones.

🚫 ¿Por qué es una mala práctica?

  • Si varias funciones usan la misma variable global, y una de ellas la cambia sin querer, puede romper todo tu programa.
  • Es difícil de rastrear y depurar.
  • Hace que el comportamiento sea impredecible.

💡 Por eso, evita modificar variables globales dentro de las funciones.

✅ Buenas prácticas

✔️ Usa parámetros y variables locales dentro de tus funciones.

✔️ Si necesitas datos globales, mantenlos constantes (sin modificarlos).

✔️ Prefiere retornar valores desde las funciones y usarlos fuera.

✅ Buenas prácticas

def saludar(nombre):
    mensaje = f"Hola, {nombre}"
    return mensaje

resultado = saludar("Danna")
print(resultado)

⬇️ Salida:

Hola, Danna

🧠 Así el flujo de datos es seguro, claro y predecible.