ProgramaciónDesarrollador Backend

¿Cómo funciona el principio de los argumentos por defecto en las funciones de Python? ¿Por qué el uso de objetos mutables (como listas) como valores por defecto puede llevar a resultados inesperados? Proporcione un ejemplo detallado.

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

En Python, los argumentos por defecto se calculan solo una vez, en el momento de la definición de la función, y no en cada llamada a la misma. Esto significa que si se utiliza un objeto mutable (como una lista o un diccionario) como valor por defecto para un parámetro, este será compartido entre todas las llamadas a la función donde este argumento no se especifique explícitamente.

Ejemplo:

def append_item(item, items=[]): items.append(item) return items print(append_item(1)) # [1] print(append_item(2)) # [1, 2], pero se esperaría [2]

Forma correcta:

def append_item(item, items=None): if items is None: items = [] items.append(item) return items

Ahora cada llamada obtiene su propia lista.

Pregunta capciosa.

Pregunta: ¿Qué sucederá al llamar a la función repetidamente con un valor de objeto mutable por defecto?

Respuesta: El mismo objeto se modifica cada vez. El ejemplo anterior ilustra esto: la lista acumula todos los valores.

Ejemplos de errores reales debido al desconocimiento de las sutilezas del tema.


Historia En una gran aplicación web, al almacenar en caché datos, se utilizaba una función con un parámetro-diccionario por defecto. Esto llevaba a que los datos entre diferentes usuarios "se filtraran" unos a otros: alguien cambiaba su perfil y esos cambios a veces se mostraban a otro usuario debido al estado global compartido del diccionario.


Historia En las pruebas, se utilizaba una función con una lista mutable por defecto para recopilar estadísticas. Los datos de una prueba "fluían" hacia otra, lo que provocaba caídas inesperadas, la imposibilidad de reproducir un error y una depuración complicada.


Historia En un microservicio para agregar logs, se acumulaban eventos utilizando una función en la que el argumento por defecto era una lista. Los logs se duplicaban: la acumulación temporal de solicitudes anteriores llegaba a nuevos clientes, lo que costó horas de investigación y pérdida de datos.