Pourquoi est-il dangereux d'utiliser une liste ou un dictionnaire comme valeur par défaut d'un paramètre de fonction en Python ?
Réponse
En Python, la valeur par défaut d'un paramètre est évaluée une seule fois, au moment où la fonction est définie, et non à chaque appel. Si cette valeur par défaut est un objet mutable comme une liste ou un dictionnaire, la même instance est réutilisée à chaque appel qui ne fournit pas explicitement cet argument. Toute modification de cet objet par défaut lors d'un appel persiste donc silencieusement d'un appel à l'autre, ce qui produit un comportement inattendu quand on s'attend à repartir d'une valeur vide à chaque fois.
Piège classique
Le piège classique est def add_item(item, bucket=[]): bucket.append(item); return bucket : chaque appel sans argument bucket accumule les éléments des appels précédents au lieu de repartir d'une liste vide. La correction standard est d'utiliser None comme valeur par défaut et de créer la liste à l'intérieur de la fonction si elle vaut None.