En Python, l'opérateur = a des fonctionnalités différentes selon le type d'objet auquel il est appliqué. Lorsqu'il est utilisé sur des listes, il génère des comportements inattendus qui peuvent s'expliquer par la compréhension des méthodes spéciales sous-jacentes qu'il appelle.
Généralement, = essaie d'invoquer la méthode spéciale __iadd__ pour un ajout sur place. S'il est absent, il recourt à l'utilisation de __add__ à la place.
Pour les listes, un type mutable, Python fournit une méthode __iadd__. Lorsqu'il rencontre =, Python appelle __iadd__ sur la liste, lui permettant de muter et d'ajouter un élément.
Si une liste n'a pas de méthode __iadd__, Python par défaut à __ajouter__. Cette méthode crée une nouvelle liste plutôt que de modifier celle d'origine. Par conséquent, = se comporte comme si vous aviez attribué une nouvelle liste en utilisant =.
Référence à l'exemple de code dans la question :
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)
SORTIE :
[1, 2] [1, 2] [1, 2, 3] [1, 2, 3] [1, 2, 3, 4] [1, 2, 3] [1] [2]
En comprenant les différences entre __iadd__ et __add__, vous pouvez anticiper le comportement de = sur les listes, évitant ainsi des des surprises.
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!