Heim >Backend-Entwicklung >Python-Tutorial >Warum erzeugt der =-Operator von Python in Listen ein unerwartetes Shared-State-Verhalten?

Warum erzeugt der =-Operator von Python in Listen ein unerwartetes Shared-State-Verhalten?

Linda Hamilton
Linda HamiltonOriginal
2024-12-14 17:08:18869Durchsuche

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

Unerwartetes Verhalten des =-Operators bei Listen

Der =-Operator in Python zeigt unerwartetes Verhalten bei der Bearbeitung von Listen, wie im folgenden Code gezeigt Snippet:

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)

Ausgabe:

[1, 2]
[1, 2]

Der =-Operator scheint jede Instanz der Klasse zu beeinflussen, während sich foo = foo bar wie erwartet verhält.

Dieses Verhalten ist auf die zugrunde liegende Implementierung des =-Operators zurückzuführen. Zunächst wird versucht, die spezielle Methode iadd aufzurufen, die für das direkte Hinzufügen vorgesehen ist und das Objekt ändert, auf das sie einwirkt. Wenn iadd nicht verfügbar ist, greift es auf die spezielle Methode add zurück, die ein neues Objekt zurückgibt.

Bei Listen nur add ist definiert, was eine neue Liste zurückgibt. Wenn = in einer Liste verwendet wird, wird daher eine neue Liste erstellt, anstatt die vorhandene Liste zu verändern. Dies erklärt, warum f und g im obigen Beispiel dieselbe Balkenliste verwenden.

Der =-Operator verhält sich bei veränderlichen Objekten anders, wo er sie direkt durch die Methode iadd ändert. Für unveränderliche Objekte wie Zeichenfolgen und Ganzzahlen ist nur Hinzufügen verfügbar, was zur Erstellung eines neuen Objekts führt.

Um es zusammenzufassen:

  • = verwendet iadd, falls definiert, und ändert das Objekt direkt.
  • If iadd ist nicht definiert, = greift auf __add__ zurück und erstellt ein neues Objekt.
  • Für veränderliche Objekte = ändert das Objekt direkt.
  • Für unveränderliche Objekte, = erstellt ein neues Objekt.

Das obige ist der detaillierte Inhalt vonWarum erzeugt der =-Operator von Python in Listen ein unerwartetes Shared-State-Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn