Heim >Backend-Entwicklung >Python-Tutorial >Wie wirkt sich Pythons =-Operator je nach __iadd__ und __add__ unterschiedlich auf Listen aus?

Wie wirkt sich Pythons =-Operator je nach __iadd__ und __add__ unterschiedlich auf Listen aus?

Susan Sarandon
Susan SarandonOriginal
2024-12-22 04:36:13372Durchsuche

How Does Python's  = Operator Differentially Affect Lists Depending on __iadd__ and __add__?

Wie der Operator = mit Listen in Python arbeitet

Der Operator = in Python zeigt unerwartetes Verhalten, wenn er auf Listen angewendet wird. Dieses Verhalten wird auf die Unterscheidung zwischen den speziellen Methoden iadd und add zurückgeführt.

iadd vs add

  • __iadd__': Direkte Hinzufügung; mutiert das Objekt, auf das reagiert wird.
  • __add__': Gibt ein neues Objekt zurück; Wird für den Standardoperator verwendet.

Verhalten bei Listen

Wenn = für eine Liste mit einer iadd-Methode verwendet wird, wird die Liste wird an Ort und Stelle geändert. Wenn iadd nicht definiert ist, wird add aufgerufen, was zu einer neuen Liste führt.

Beispiel

Bedenken Sie Folgendes Code:

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)

Ausgabe

[1, 2]
[1, 2]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3]
[1]
[2]

Erläuterung

  • foo implementiert __iadd__, also = ändert sich f.bar, wodurch alle Instanzen von foo.
  • foo2 betroffen sind __iadd__ fehlt, also = löst __add__ aus und gibt eine neue Liste zurück, die f.bar ersetzt.
  • foo2 behält seine ursprüngliche Balkenliste bei, während foo sie global ändert.

Fazit

Das Verhalten von = auf Listen hängt davon ab, ob es aufruft iadd oder add__. Die direkte Änderung erfolgt mit __iadd__, während __add eine neue Liste erstellt.

Das obige ist der detaillierte Inhalt vonWie wirkt sich Pythons =-Operator je nach __iadd__ und __add__ unterschiedlich auf Listen aus?. 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