Desarrollador Python: pregunta de entrevista
¿Por qué son peligrosos los argumentos por defecto mutables?
Los argumentos por defecto se evalúan una vez al definir la función, por lo que una lista o dict mutable se comparte entre llamadas; usa None y crea un objeto nuevo dentro.
Respuesta directa
Qué debe cubrir una buena respuesta
Cómo funciona
Los valores por defecto son expresiones evaluadas exactamente una vez, cuando se ejecuta el def, y se guardan en el objeto función. Una lista, dict o set por defecto es por tanto un único objeto que comparten todas las llamadas sin ese argumento, así que las mutaciones de una llamada se filtran a la siguiente. El idioma es un centinela None con el valor real creado dentro del cuerpo. La misma regla explica por qué un valor por defecto datetime.now() queda congelado al importar.
Ejemplo
def add_item(item, items=[]) añade a la misma lista en cada llamada, así que add_item(1) seguido de add_item(2) devuelve [1, 2] en la segunda llamada. Escribir items=None y luego items = [] if items is None else items da a cada llamada una lista nueva y hace explícita la intención.
Errores frecuentes
- Detectar el bug solo en pruebas que corren en un orden distinto al de producción.
- Arreglarlo con items.copy() dentro de la función mientras se sigue compartiendo el valor por defecto.
- Suponer que el problema se limita a listas cuando cualquier valor mutable, incluida una instancia de clase, se comporta igual.
Una estructura útil para responder
Responde desde tu propia experiencia.
No memorices un guion: usa solo ejemplos que puedas explicar con honestidad en preguntas posteriores.
Abre el espacio de trabajo de escritorio y ensaya una respuesta clara con tus propias palabras.