Python

Variables globales en Python: Problemas y cómo evitarlos

Las variables globales pueden ser útiles en algunas situaciones, pero un excesivo o inadecuado de estas generan problemas. Desde un código difícil de mantener, pasado por efectos secundarios inesperados o errores de los programas en tiempo de ejecución. En esta entrada veremos qué son las variables globales en Python, los principales problemas de sus uso excesivo y cómo evitarlos con buenas prácticas.

¿Qué es una variable global en Python?

Una variable global es aquella definida fuera de cualquier función o clase y que, por lo tanto, es accesible desde cualquier parte del código. Un ejemplo de una variable global es la variable contador en el siguiente código:

contador = 0  # Variable global

def incrementar():
    global contador  # Modificamos la variable global
    contador += 1

incrementar()
print(contador)  # 1

Aunque esto puede parecer una práctica válida para esta tarea, cuando el código aumenta en complejidad pueden aparecer varios problemas.

Problemas con las variables globales en Python

Entre los principales problemas que puede traer el uso de variables globales en Python se pueden enumerar los siguientes.

Código menos mantenible y difícil de depurar

El uso de variables globales hace que el código sea menos predecible. Si varias funciones modifican la misma variable global, puede ser difícil rastrear dónde y por qué ha cambiado.

estado = "inicial"

def cambiar_estado():
    global estado
    estado = "modificado"

cambiar_estado()
print(estado)  # "modificado"

Este tipo de código es difícil de depurar cuando el programa aumenta de tamaño.

Solución: Usa variables locales y pasa valores como parámetros en lugar de depender de variables globales

Una solución a este problema es pasar la variable que se desea modificar como un parámetro y recuperar esta, de este modo los cambios siempre estarán acotados. Evitando que se produzcan cambios accidentales.

def cambiar_estado(estado):
    return "modificado"

estado = "inicial"
estado = cambiar_estado(estado)
print(estado)  # "modificado"

Problemas con efectos secundarios en funciones

Si una función usa una variable global, su comportamiento puede cambiar de forma impredecible según el estado global.

descuento = 0.1  # Variable global

def calcular_precio(precio):
    return precio * (1 - descuento)  # Depende de la variable global

print(calcular_precio(100))  # 90.0
descuento = 0.2
print(calcular_precio(100))  # 80.0 (Resultado inesperado)

En este caso el descuento puede ser modificado con un valor que no es el esperado o no recuperar el valor original

Solución: Usa parámetros explícitos para mejorar la claridad y evitar dependencias ocultas.

Para este caso, la solución es pasar el descuento como un parámetro de modos que se pueda modificar en cualquier momento. Un valor que se puede dejar como opcional con un descuento por defecto

def calcular_precio(precio, descuento=0.2):
    return precio * (1 - descuento)

print(calcular_precio(100))       # 80.0
print(calcular_precio(100, 0.1))  # 90.0
print(calcular_precio(100, 0.2))  # 80.0

Cuándo es seguro usar variables globales

En algunos casos, las variables globales pueden ser útiles.

Para definir constantes globales

Se pueden usar para definir valores que no mutan a lo largo del programa.

PI = 3.1416  # Se usa mayúsculas para indicar que es constante

Para configuraciones compartidas

Los parámetros de configuración, que tampoco suelen mutar durante la ejecución del programa también se pueden guardar en una variable global

config = {
   "modo_debug": True,
   "version": "1.0.0"
}

Cuando se usan de forma controlada en scripts pequeños

En script pequeños, tampoco suele ser un problema recurrir a variables globales.

contador = 0

def incrementar():
    global contador
    contador += 1

Mejores prácticas recomendadas

Si necesitas compartir datos entre funciones, considera las siguientes opciones antes de recurrir a una variable global.

Usar parámetros y valores de retorno

La primera opción debería ser usar parámetros y valores de retorno para gestionar mejor los cambios en los valores de las variables.

def actualizar_dato(valor):
    return valor + 1

dato = 0
dato = actualizar_dato(dato)

Usar clases y atributos de instancia

En lugar de variables globales, se pueden crear clases para compartir valores en cada una de las instancias de la clase.

class Contador:
    def __init__(self):
        self.valor = 0

    def incrementar(self):
        self.valor += 1

c = Contador()
c.incrementar()
print(c.valor)  # 1

Usar un espacio de nombres (módulo)

En lugar de usar una variable global en el mismo archivo, defínela en un módulo separado.

Archivo config.py:

config = {
    "modo_debug": True,
    "version": "1.0.0"
}

Uso en otro archivo:

import config

print(config.config["modo_debug"])  # True

Conclusiones

Las variables globales en Python pueden parecer una solución rápida para compartir datos entre funciones, pero su uso excesivo puede causar problemas de mantenimiento, depuración y concurrencia.

Para evitar estos problemas:

  • Usa variables locales y pásalas como parámetros.
  • Usa clases y estructuras de datos adecuadas.
  • Usa módulos para gestionar configuraciones globales.
  • Si es necesario usar variables globales, hazlo de manera controlada.

Adoptar buenas prácticas hará que tu código sea más seguro, claro y mantenible.

Nota: La imagen de este artículo fue generada utilizando un modelo de inteligencia artificial.

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

Data Lake y Data Warehouse: diferencias, usos y cómo se complementan en la era del dato

En la era del dato, las organizaciones se enfrentan al reto de gestionar volúmenes masivos…

3 días ago

Documentar tu API de Express con TypeScript usando OpenAPI (Swagger)

En la serie Creación de una API REST con Express y TypeScript construimos una API…

5 días ago

Curiosidad: El sesgo de supervivencia, o por qué prestar atención sólo a los que “llegaron” puede engañarte

Durante la Segunda Guerra Mundial, la Fuerza Aérea de Estados Unidos quería reforzar sus aviones…

1 semana ago

Cómo abrir una ventana de Chrome con tamaño y posición específicos desde la línea de comandos en Windows

En muchas situaciones —ya sea para grabar un tutorial, tomar capturas de pantalla profesionales, probar…

2 semanas ago

La Paradoja del Cumpleaños, o por qué no es tan raro compartir fecha de nacimiento

Imagínate en una sala con un grupo de personas, por ejemplo, en una oficina, un…

2 semanas ago

Programador de tareas de Windows: Guía definitiva para automatizar tu trabajo (BAT, PowerShell y Python)

En el trabajo diario con ordenadores, es común encontrarse con tareas repetitivas: realizar copias de…

3 semanas ago

This website uses cookies.