PythonIntermedio2 nov 2025

El Secreto Sucio de tus Listas: Argumentos por Defecto Mutables en Python

snippet.python
def add_to_list(item, my_list=[]):
    my_list.append(item)
    return my_list
print(add_to_list(1))
print(add_to_list(2))
print(add_to_list(3, ['a', 'b']))
print(add_to_list(4))

¿Qué crees que imprime?

Salida Esperada

[
    [1],
    [2],
    ['a', 'b', 3],
    [4]
]

⚠️ Salida Real

[
    [1],
    [1, 2],
    ['a', 'b', 3],
    [1, 2, 4]
]

¿Por qué pasa esto?

¡Aquí tenemos un clásico Python que te hará exclamar "¡¿Pero QUÉ ha pasado?!" 😱. Este comportamiento es cortesía de los **argumentos por defecto mutables**. Python, en su sabiduría (o travesura), evalúa los **argumentos por defecto solo UNA VEZ**: cuando la función se define, no cada vez que la llamas. Si ese argumento por defecto es un **objeto mutable** (como una lista `[]`, un diccionario `{}` o un conjunto `set()`), ¡todas las llamadas que NO le pasen su propio valor compartirán la MISMA instancia de ese objeto! Es como si tuvieras un único plato de galletas 🍪 para todas las fiestas: si no traes el tuyo, ¡comerás del mismo plato compartido que se va vaciando con cada invitado! 👻 Para evitar esta fiesta de confusión, el truco es usar `None` como valor por defecto y luego, dentro de la función, inicializar el objeto mutable si `None` fue pasado. Así, cada llamada que no provea un valor, obtendrá su propio plato de galletas nuevecito. ¡No más sorpresas compartidas! 🥳

Conceptos relacionados

mutabilityfunction-designdefault-arguments