Comportement inattendu de l'opérateur = sur les listes
L'opérateur = en Python présente un comportement inattendu lors de l'opération sur des listes, comme démontré dans le code suivant extrait :
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)
Sortie :
[1, 2] [1, 2]
L'opérateur = semble affecter chaque instance de la classe, tandis que la barre foo = foo se comporte comme prévu.
Ce comportement découle de l'implémentation sous-jacente de l'opérateur =. Il tente d'abord d'appeler la méthode spéciale iadd, destinée à l'ajout sur place et modifie l'objet sur lequel elle agit. Si iadd n'est pas disponible, il revient à la méthode spéciale add, qui renvoie un nouvel objet.
Dans le cas des listes, uniquement add est défini, ce qui renvoie une nouvelle liste. Par conséquent, lorsque = est utilisé sur une liste, cela crée une nouvelle liste au lieu de muter la liste existante. Cela explique pourquoi f et g partagent la même liste de barres dans l'exemple ci-dessus.
L'opérateur = se comporte différemment pour les objets mutables, où il les modifie sur place via la méthode iadd. Pour les objets immuables comme les chaînes et les entiers, seul ajouter est disponible, entraînant la création d'un nouvel objet.
Pour résumer :
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!