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.

Practica esta respuesta con MiraHint

Abre el espacio de trabajo de escritorio y ensaya una respuesta clara con tus propias palabras.

Descargar MiraHint
Preguntas de entrevista para Desarrollador Python