habe ich diesen Python-Snippet auf Twitter und wurde ganz durch die Ausgabe verwirrt:Python Zuordnung Operator Präzedenz - (a, b) = a [b] = {}, 5
>>> a, b = a[b] = {}, 5
>>> a
{5: ({...}, 5)}
Was ist hier los ?
habe ich diesen Python-Snippet auf Twitter und wurde ganz durch die Ausgabe verwirrt:Python Zuordnung Operator Präzedenz - (a, b) = a [b] = {}, 5
>>> a, b = a[b] = {}, 5
>>> a
{5: ({...}, 5)}
Was ist hier los ?
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 b
5
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
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
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
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'? –