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:
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!