ProgrammationDéveloppeur Backend

Comment fonctionne le principe des arguments par défaut en Python ? Pourquoi l'utilisation d'objets modifiables (comme des listes) comme valeurs par défaut peut-elle entraîner des résultats inattendus ? Donnez un exemple détaillé.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

En Python, les arguments par défaut ne sont calculés qu'une seule fois — au moment de la définition de la fonction, et non à chaque appel. Cela signifie que si un objet modifiable (comme une liste ou un dictionnaire) est utilisé comme valeur par défaut pour un paramètre, cet objet sera partagé entre tous les appels de la fonction où cet argument n'est pas spécifié.

Exemple :

def append_item(item, items=[]): items.append(item) return items print(append_item(1)) # [1] print(append_item(2)) # [1, 2], alors qu'on s'attendrait à [2]

La bonne façon :

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

Maintenant, chaque appel reçoit sa propre liste.

Question piégeuse.

Question : Que se passe-t-il lors d'appels répétés de la fonction avec une valeur d'objet modifiable par défaut ?

Réponse : Le même objet est modifié à chaque fois. L'exemple ci-dessus illustre cela — la liste accumule toutes les valeurs.

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet.


Histoire Dans une grande application web, lors de la mise en cache des données, une fonction avec un dictionnaire par défaut était utilisée. Cela conduisait à une « fuite » des données entre différents utilisateurs : quelqu'un modifiait son profil — et ces modifications apparaissaient parfois pour un autre utilisateur à cause de l'état global partagé du dictionnaire.


Histoire Dans les tests, une fonction avec une liste modifiable par défaut était utilisée pour collecter des statistiques. Les données d'un test « coulaient » dans un autre, ce qui entraînait des plantages inattendus, l'impossibilité de reproduire le bug et un débogage complexe.


Histoire Dans un microservice pour l'agrégation des journaux, on accumulait des événements via une fonction où l'argument par défaut était une liste. Les journaux étaient dupliqués — l'accumulation temporaire des anciennes requêtes atteignait de nouveaux clients, ce qui coûtait des heures d'enquête et entraînait des pertes de données.