Maison > développement back-end > Tutoriel Python > Comment l'opérateur = de Python affecte-t-il différemment les listes en fonction de __iadd__ et __add__ ?

Comment l'opérateur = de Python affecte-t-il différemment les listes en fonction de __iadd__ et __add__ ?

Susan Sarandon
Libérer: 2024-12-22 04:36:13
original
374 Les gens l'ont consulté

How Does Python's  = Operator Differentially Affect Lists Depending on __iadd__ and __add__?

Comment l'opérateur = fonctionne sur les listes en Python

L'opérateur = en Python présente un comportement inattendu lorsqu'il est appliqué aux listes. Ce comportement est attribué à la distinction entre les méthodes spéciales iadd et add.

iadd vs ajouter

  • __iadd__' : Ajout sur place ; mute l'objet sur lequel on agit.
  • __add__': Renvoie un nouvel objet ; utilisé pour l'opérateur standard.

Comportement sur les listes

Lorsque = est utilisé sur une liste avec une méthode iadd, la liste est modifié sur place. Si iadd n'est pas défini, add est invoqué, ce qui entraîne une nouvelle liste.

Exemple

Considérez ce qui suit code :

class foo:
    bar = []
    def __init__(self, x):
        self.bar += [x]

class foo2:
    bar = []
    def __init__(self, x):
        self.bar = self.bar + [x]

f = foo(1)
g = foo(2)
print(f.bar)
print(g.bar)

f.bar += [3]
print(f.bar)
print(g.bar)

f.bar = f.bar + [4]
print(f.bar)
print(g.bar)

f = foo2(1)
g = foo2(2)
print(f.bar)
print(g.bar)
Copier après la connexion

Sortie

[1, 2]
[1, 2]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3]
[1]
[2]
Copier après la connexion

Explication

  • foo implémente __iadd__, donc = modifie f.bar, ce qui affecte toutes les instances de foo.
  • foo2 n'a pas __iadd__, donc = déclenche __add__, renvoyant une nouvelle liste qui remplace f.bar.
  • foo2 préserve sa liste de barres d'origine, tandis que foo la modifie globalement.

Conclusion

Le comportement de = sur les listes dépend du fait qu'il appelle ou non iadd ou add__. La modification sur place se produit avec __iadd__, tandis que __add crée une nouvelle liste.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal