Unterschied zwischen a [:] = b und a = b [:]? (Python)

8

Ich wurde dies für einen Codierungstest gefragt und wusste die Antwort nicht. Hat jemand irgendwelche Ideen?

    
user701632 11.08.2011, 22:07
quelle

3 Antworten

8

[:] ist der Slice-Operator.

Wenn es sich auf der linken Seite befindet, überschreibt es den Inhalt der Liste, ohne eine neue Referenz zu erstellen.

Wenn es auf der rechten Seite ist, erstellt es eine Kopie der Liste mit dem gleichen Inhalt.

    
recursive 11.08.2011, 22:08
quelle
2

a = b[:] ruft entweder __getslice__ oder __getitem__ für b und weist das Ergebnis a zu. In fast allen Fällen (z. B. Listen, Tupeln und anderen Sequenztypen) ergibt dies eine flache Kopie der Sequenz; Ich kenne keine Klassen, die dieses Verhalten nicht implementieren, aber Sie könnten einen benutzerdefinierten Typ haben, der etwas anderes gemacht hat. Alle anderen Objekte, die zuvor auf den alten Wert von a verwiesen haben, verweisen weiterhin auf diesen alten Wert.

a[:] = b hingegen ruft __setslice__ oder __setitem__ , um eine Teilmenge der Elemente von a durch die der Sequenz b zu ersetzen. Wenn in diesem Fall der Sequenztyp von a korrekt ist, ersetzt dies die Gesamtheit von a , da der Bereich : ohne Endpunkte die gesamte Sequenz angibt. Der Unterschied besteht hier darin, dass unveränderliche Typen wie Tupel es nicht erlauben, __setslice__ auszuführen (z. B. durch Ausgeben einer TypeError -Ausnahme). Alle anderen Objekte, die zuvor auf a verwiesen haben, werden ebenfalls aktualisiert, da das zugrunde liegende Objekt geändert wird.

Für änderbare Typen wie list ist das Ergebnis von a = b[:] identisch mit a[:] = b , da a eine flache Kopie von b ist; Für unveränderliche Typen wie tuple , a[:] = b ist ungültig. Für schlecht benützte benutzerdefinierte Typen sind alle Wetten deaktiviert. Es gibt auch einen Unterschied in dem, was mit anderen Objekten geschieht, die sich auf dasselbe Objekt beziehen wie a - mit a = b[:] , sie beziehen sich auf den ursprünglichen Wert ( a ), aber mit a[:] = b beziehen sie sich auf das modifizierte Objekt Objekt (flache Kopie von b ).

    
Adam Rosenfield 11.08.2011 22:38
quelle
1

In beiden Fällen endet die Liste a als Kopie der Liste b . Aber die Methode, um dies zu erreichen, hat sich geändert.

a[:] = b ändert die Liste a so, dass sie dieselben Elemente enthält wie b

a = b[:] erzeugt eine neue Liste, die eine Kopie von b ist und ersetzt die Liste a

Der Unterschied besteht darin, ob wir eine bestehende Liste geändert oder eine neue Liste erstellt haben.

Um den Unterschied zu sehen:

%Vor%

Alle drei Listen werden gleich ausgedruckt. C und a teilen das gleiche Objekt, also wenn a geändert wurde, so war c

%Vor%

Nun wird c nicht gleich wie a ausgedruckt. Nach der Zuweisung hatten a und c nicht dasselbe Objekt.

Geschwindigkeit, a[:] = b' is probably a little faster then a = b [:] '. Das erste Formular muss kein neues Listenobjekt erstellen, es kann lediglich die vorhandene Liste ändern. Ein großer Teil davon ist, dass es den Speicher, der bereits der Liste gehört, wiederverwenden kann, anstatt neuen Speicher zuzuweisen.

    
Winston Ewert 11.08.2011 22:23
quelle

Tags und Links