Ich habe diesen interessanten Beitrag Ссылка
gelesenBei der Fußnote Autor präsentieren dieses Beispiel
%Vor%Obwohl Python eine Ausnahme ausgelöst hat, hat es das Tupel jedoch geändert
%Vor%Nicht sicher, was hier vor sich geht, ist das ein Fehler?
Das Verhalten ist in 2.7.10 und 3.5.1 identisch.
Also ist das Verhalten von +=
etwas komisch. Für unveränderliche Objekte wie Integer muss ein neues Objekt demselben Namen zugewiesen werden:
Für veränderbare Typen, z.B. Listen, das Objekt wird an Ort und Stelle geändert, gibt aber auch das gleiche Objekt zurück, das demselben Namen zugewiesen werden soll. Der erste Schritt funktioniert mit Ihrem Tupel, aber nicht der zweite.
Aus diesem Grund wird die Ausnahme nach der Erweiterung der Liste ausgelöst.
Dies liegt daran, dass der +=
-Operator (der __iadd__
ist, oder direkt intern hinzugefügt wird) tatsächlich nach der Zuweisung etwas zurückgibt. In einem list
wird dies in einen extend
Aufruf (oder so ähnlich) übersetzt und somit sind die neuen Elemente bereits eingegangen, bevor der Verweis auf die Liste zur Zuweisung an t[2]
zurückgegeben wurde, was dann die Ausnahme auslöst. Jetzt überprüfen Sie den Wert, den Sie sehen können, dass es hinzugefügt wurde. Der folgende Code ist der Mindestcode, um dies zu demonstrieren:
Beachten Sie, dass ich einige weitere print-Anweisungen hinzugefügt habe, um zu zeigen, dass die Funktion aufgerufen wird und wie die Operation ausgeführt wurde, wie bei einer standardmäßigen list
-Manipulation über +=
oder __iadd__
.
Dies ist kein Fehler, aber der Status, in dem Sie verbleiben werden, wenn die Ausnahme ausgelöst wird, könnte verwirrend sein.
Ein Tupel nach Design darf nicht geändert werden, aber das gilt nur für das Tupel und nicht für seine Elemente. Wenn es ein veränderbares Element enthält, kann dieses Element geändert werden. In Ihrem Fall ist die Liste ein solcher Punkt, der geändert werden kann.
Nun bildet der Operator +=
mehr oder weniger eine +
ab und weist sie dann der ursprünglichen Variablen zu. Die Operation +
ist möglich, Sie können zwei Listen hinzufügen. Zur Optimierung wird der +
wie ein extend()
implementiert und aktualisiert. Aber die Zuweisung schlägt fehl, da das Tupelobjekt nicht chantiiert werden kann.
Es gibt grundsätzlich zwei Lektionen:
Tags und Links python list python-3.x python-2.7 tuples