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