Unterschiedliches Verhalten: list.__iadd__ vs. list.__add__
Betrachten Sie den folgenden rätselhaften Python-Code:
x = y = [1, 2, 3, 4] x += [4] print(x) # [1, 2, 3, 4, 4] print(y) # [1, 2, 3, 4, 4]
Vergleichen Sie es nun mit diesem Codeausschnitt:
x = y = [1, 2, 3, 4] x = x + [4] print(x) # [1, 2, 3, 4, 4] print(y) # [1, 2, 3, 4]
Was uns verblüfft, ist der große Unterschied in ihrem Verhalten. Warum ändert x = [4] die ursprüngliche Liste x, während x = x [4] zu einer neuen Liste führt?
Die Antwort liegt in den Objektmethoden von Python. list.__iadd__ mutiert die vorhandene Liste, indem die Elemente der zweiten Liste an sie angehängt werden. Umgekehrt erstellt list.__add__ eine neue Liste, die die Elemente beider Eingabelisten enthält.
Ein Ausdruck wie x = y versucht zunächst, __iadd__ aufzurufen. Wenn __iadd__ verfügbar ist, wird dieser Mutationszauber ausgeführt. Andernfalls wird standardmäßig __add__ verwendet, wodurch eine neue Liste erstellt und x zugewiesen wird. Da die Listenklasse __iadd__ definiert, ändert der erste Codeausschnitt die ursprüngliche x-Liste, während der zweite Codeausschnitt eine neue Liste erstellt und diese x zuweist, wobei y unverändert bleibt.
Das obige ist der detaillierte Inhalt vonWarum ändert „x = [4]' „x', aber „x = x [4]' erstellt eine neue Liste in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!