2015-08-20 12 views

Antwort

17

Von Assignment statements documentation:

eine Zuweisungsanweisung auswertet die Ausdrucksliste (nicht vergessen, dass dies eine einzelner Ausdruck oder eine kommagetrennte Liste sein kann, wobei die letztere ein Tupel Nachgeben) und weist das einzelne resultierende Objekt jede der Ziellisten von links nach rechts.

Sie haben zwei Zuweisungsziellisten; a, b und a[b] wird den beiden Zielen von links nach rechts der Wert {}, 5 zugewiesen.

Zuerst wird das {}, 5 Tupel zu a, b ausgepackt. Sie haben jetzt a = {} und b = 5. Beachten Sie, dass {} veränderbar ist.

Weiter weisen Sie gleichen Wörterbuch und integer zu a[b], wo a das Wörterbuch auswertet und b5 ausgewertet, so dass Sie sind die Schlüssel 5 im Wörterbuch zu dem Tupel ({}, 5) eine kreisförmige Referenzeinstellung zu schaffen. Die {...} bezieht sich somit auf das gleiche Objekt, das bereits auf a verweist.

Da Zuordnung von links nach rechts erfolgt, können Sie diese brechen auf:

a, b = {}, 5 
a[b] = a, b 

so a[b][0] ist das gleiche Objekt wie a:

>>> a, b = {}, 5 
>>> a[b] = a, b 
>>> a 
{5: ({...}, 5)} 
>>> a[b][0] is a 
True 
+4

Hmm, die für Python überraschenderweise nicht intuitiv ist! Ich würde erwarten, dass es von rechts nach links kaskadiert und so einen "NameError" auslöst, wobei "a [b] = a, b = {}, 5" funktioniert. – Claudiu

+0

Ausgezeichnete Antwort. Ich habe herausgefunden, was los ist, bevor ich gepostet habe und eine Antwort geplant habe, aber Sie haben es sehr gut beantwortet. Außerdem ist +1 für die 'a [b] [0] eine' Zeile. – Andrew

+0

Schöne Antwort! Aber die Dokumente sagen _ weist das ** einzelne resultierende Objekt ** den einzelnen Ziellisten zu, von links nach rechts_, also sollte es nicht äquivalent zu 'a, b = {}, 5; a [b] = {}, 5'? –

Verwandte Themen