Maison > développement back-end > Tutoriel Python > Pourquoi l'opérateur = de Python sur les listes produit-il un comportement d'état partagé inattendu ?

Pourquoi l'opérateur = de Python sur les listes produit-il un comportement d'état partagé inattendu ?

Linda Hamilton
Libérer: 2024-12-14 17:08:18
original
877 Les gens l'ont consulté

Why Does Python's  = Operator on Lists Produce Unexpected Shared-State Behavior?

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)
Copier après la connexion

Sortie :

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

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 :

  • = utilise iadd si défini, modifiant l'objet sur place.
  • Si iadd n'est pas défini, = revient à __add__, créant un nouvel objet.
  • Pour les objets mutables, = modifie l'objet sur place. .
  • Pour les objets immuables, = crée un nouvel objet.

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