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 ?
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!