Maison >développement back-end >Tutoriel Python >Pourquoi le comportement de l'argument mutable par défaut de Python entraîne-t-il une accumulation inattendue ?
Le « moindre étonnement » et l'argument par défaut mutable
Le comportement de l'argument par défaut mutable de Python a longtemps intrigué les développeurs débutants et expérimentés. Une fonction comme foo(a=[]) accumule de manière inattendue des valeurs dans a à travers plusieurs appels, ce qui laisse beaucoup de gens s'interroger sur sa justification.
Pour comprendre la racine de cette conception apparemment imparfaite, nous devons nous plonger dans la nature des fonctions Python. comme des objets de première classe. Lorsqu'une fonction est définie, elle est essentiellement évaluée comme un objet lui-même. Cela signifie que les paramètres par défaut, comme a=[] dans notre exemple, deviennent des attributs de l'objet fonction.
Ainsi, lorsqu'une fonction est appelée, ce n'est pas la valeur du paramètre par défaut qui est évaluée, mais plutôt la attribut qui pointe vers l'objet de liste créé lors de la définition de la fonction. En conséquence, toute modification apportée à la liste au sein de la fonction affecte la référence partagée, expliquant le comportement d'accumulation de a.
Cette approche s'aligne sur la philosophie du « moindre étonnement » de Python, qui donne la priorité à la cohérence et au respect des objectifs. principes orientés. Tout comme les variables d'instance dans les classes peuvent changer au fil du temps, ces "données membres" dans les objets de fonction peuvent également changer.
Ce comportement a également un objectif pratique : il permet aux fonctions d'avoir un état qui persiste à travers les appels. Prenons l'exemple suivant :
def a(): print("a executed") return [] def b(x=a()): x.append(5) print(x) a executed >>> b() [5] >>> b() [5, 5]
Ici, la valeur renvoyée par a() est partagée par tous les appels à b(), permettant à la liste d'être modifiée et conservée sur plusieurs itérations. Lier l'argument par défaut lors de l'exécution de la fonction créerait effectivement une nouvelle liste à chaque fois que b() est appelé, rendant ce comportement impossible.
En conclusion, même si le comportement de l'argument par défaut mutable de Python peut sembler contre-intuitif au premier abord, il découle de la nature fonctionnelle de première classe du langage et s'aligne sur les principes de programmation orientée objet et de cohérence.
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!