Le « moindre étonnement » et l'argument par défaut mutable
Le comportement surprenant de Python avec les arguments par défaut mutables a intrigué d'innombrables développeurs. Considérez ce qui suit :
def foo(a=[]): a.append(5) return a
Intuitivement, on pourrait s'attendre à ce que cette fonction renvoie toujours une liste contenant uniquement [5] lorsqu'elle est appelée sans paramètres. Cependant, cette hypothèse est brisée par le résultat réel :
>>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] >>> foo() [5, 5, 5, 5]
Alors, que se passe-t-il ?
La clé réside dans les objets fonctions de première classe de Python. Lorsqu'une fonction est définie, elle est évaluée immédiatement, y compris l'évaluation des arguments par défaut. Dans le cas de foo, la valeur par défaut de a est évaluée comme une liste vide. Cependant, cette liste est stockée dans l'objet fonction lui-même, ce qui la rend modifiable pour les appels ultérieurs.
Contrairement à des langages comme C, les paramètres de fonction en Python ne sont pas des variables statiques évaluées au moment de la compilation. Au lieu de cela, ils sont liés à des objets qui peuvent changer au fil du temps. Ce concept de « données membres » dans les objets fonction explique le comportement étonnant que nous observons avec les arguments par défaut mutables.
Comme le note effbot dans Valeurs des paramètres par défaut en Python, ce comportement est logique et cohérent avec le fonctionnement des autres objets. :
"N'importe quel objet peut voir son état changer d'un appel à un autre. Pourquoi les fonctions devraient-elles être différentes ?"
Par conséquent, même si ce comportement peut initialement être surprenant, il suit finalement le principe du « moindre étonnement » en s'alignant sur la nature orientée objet de Python et les attentes du comportement des objets mutables.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!