Les arguments par défaut sont évalués une seule fois, à la définition de la fonction, et non à chaque appel. Une liste ou un dictionnaire par défaut est donc un unique objet partagé qui persiste d'un appel à l'autre, si bien que les mutations s'accumulent et fuient entre les appelants. Le remède est de mettre None par défaut et de créer un conteneur neuf dans le corps quand l'argument vaut None.
Pourquoi les recruteurs posent cette question
C'est un test rapide pour savoir si vous comprenez qu'une instruction def s'exécute et lie des objets au moment de la définition. Les recruteurs l'aiment parce que la mauvaise réponse est assurée et précise : les gens jurent que la liste est recréée à chaque appel. Cela ouvre aussi la porte à parler de la différence entre lier un nom et copier une valeur, qui est à la racine de beaucoup de surprises en Python.
Comment structurer votre réponse
- Dites que les valeurs par défaut sont évaluées une fois, à la définition.
- Expliquez la conséquence de l'objet partagé.
- Donnez le remède avec la sentinelle None.
- Notez que les valeurs par défaut immuables sont sûres.
Exemple de réponse
Parce que l'objet par défaut est créé une seule fois, quand Python exécute l'instruction def, et qu'ensuite chaque appel qui omet l'argument reçoit ce même objet. Si c'est une liste et que la fonction y ajoute des éléments, le troisième appel voit ce que les deux premiers ont laissé. Je suis tombé dessus sur un utilitaire de cache qui prenait un dictionnaire d'options vide par défaut. Dans un worker à longue durée de vie, le dictionnaire a grossi pendant des jours et une requête a fini par hériter des réglages d'un locataire sans rapport, ce qui n'est pas un bug agréable à expliquer. Le remède est banal : None par défaut, puis à l'intérieur on teste explicitement None et on construit un dictionnaire neuf, de sorte qu'un dictionnaire vide passé volontairement reste respecté. Les valeurs par défaut immuables comme les entiers, les chaînes ou None ne posent pas de problème parce que rien ne peut les muter. Ruff signale cela en B006 dès l'installation, donc c'est le genre de bug qui ne devrait jamais atteindre la revue dans un projet où le lint est branché sur la CI.
Vous passez cet entretien bientôt ? GhostPilot écoute votre appel en direct, repère la question dès qu'elle est posée et affiche une réponse structurée à l'écran en temps réel. Essayez-le lors de votre prochain entretien blanc, ou prenez un Session Pass à $29, sans abonnement, pour le jour J.
Voir comment ça marcheQuestions de relance à prévoir
- Pourquoi utiliser or au lieu d'un test explicite sur None est-il risqué ?
- Les tuples sont-ils sûrs comme valeurs par défaut ?
- Où l'évaluation au moment de la définition surprend-elle encore les gens ?
Autres questions pour Développeur Python
Votre recruteur posera sa propre version de celle-ci. Collez votre véritable fiche de poste dans le Question Predictor gratuit et obtenez les 20 questions que ce poste a le plus de chances de poser, avec ce que chacune cherche vraiment à sonder.
Prédire mes questions