Tupel-Zuweisung in Python, Ist das ein Fehler in Python? [Duplikat]

8

Ich habe diesen interessanten Beitrag Ссылка

gelesen

Bei 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.

    
DevC 24.09.2016, 07:00
quelle

3 Antworten

3

Also ist das Verhalten von += etwas komisch. Für unveränderliche Objekte wie Integer muss ein neues Objekt demselben Namen zugewiesen werden:

%Vor%

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.

    
Daniel 24.09.2016 07:10
quelle
3

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:

%Vor%

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__ .

    
metatoaster 24.09.2016 07:10
quelle
0

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:

  1. Python-Operatoren können nach Typ implementiert werden und verhalten sich möglicherweise anders als die trivialen Erwartungen.
  2. Wenn beim Aufruf einer Funktion eine Exception ausgelöst wird und diese nicht richtig gehandhabt wird, hat sie möglicherweise etwas getan, was nicht bereinigt wurde.
Klaus D. 24.09.2016 07:24
quelle