Maison  >  Article  >  développement back-end  >  Pourquoi `x = [4]` modifie-t-il `x` mais `x = x [4]` crée-t-il une nouvelle liste en Python ?

Pourquoi `x = [4]` modifie-t-il `x` mais `x = x [4]` crée-t-il une nouvelle liste en Python ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-30 02:09:03904parcourir

Why Does `x  = [4]` Modify `x` but `x = x   [4]` Create a New List in Python?

Comportement disparate : list.__iadd__ vs list.__add__

Considérez le code Python énigmatique suivant :

x = y = [1, 2, 3, 4]
x += [4]
print(x)  # [1, 2, 3, 4, 4]
print(y)  # [1, 2, 3, 4, 4]

Maintenant, juxtaposez-le à cet extrait de code :

x = y = [1, 2, 3, 4]
x = x + [4]
print(x)  # [1, 2, 3, 4, 4]
print(y)  # [1, 2, 3, 4]

Ce qui nous laisse perplexes, c'est la différence marquée dans leur comportement. Pourquoi x = [4] modifie-t-il la liste x d'origine, alors que x = x [4] génère une nouvelle liste ?

La réponse réside dans les méthodes objet de Python. list.__iadd__ mute la liste existante en y ajoutant les éléments de la deuxième liste. À l'inverse, list.__add__ crée une nouvelle liste comprenant les éléments des deux listes d'entrée.

Une expression comme x = y tente d'abord d'invoquer __iadd__. Si __iadd__ est disponible, il exécutera cette magie de mutation. Sinon, la valeur par défaut sera __add__, ce qui créera une nouvelle liste et l'attribuera à x. Puisque la classe de liste définit __iadd__, le premier extrait de code mute la liste x d'origine, tandis que le dernier extrait de code crée une nouvelle liste et l'attribue à x, laissant y inchangé.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn