In Python (ich habe nur mit Python 3.6 geprüft, aber ich glaube, dass dies auch für viele der vorherigen Versionen gelten sollte):
(0, 0) == 0, 0 # results in a two element tuple: (False, 0)
0, 0 == (0, 0) # results in a two element tuple: (0, False)
(0, 0) == (0, 0) # results in a boolean True
Aber:
a = 0, 0
b = (0, 0)
a == b # results in a boolean True
Warum unterscheidet sich das Ergebnis zwischen den beiden Ansätzen? Behandelt der Gleichheitsoperator Tupel anders?
quelle
,
Bindung weniger eng ist als==
.Was Sie in allen drei Fällen sehen, ist eine Folge der Grammatikspezifikation der Sprache und der Art und Weise, wie im Quellcode gefundene Token analysiert werden, um den Analysebaum zu generieren.
Ein Blick auf diesen Low-Level-Code soll Ihnen helfen, zu verstehen, was unter der Haube passiert. Wir können diese Python-Anweisungen nehmen, sie in Bytecode konvertieren und sie dann mit dem
dis
Modul dekompilieren :Fall 1:
(0, 0) == 0, 0
(0, 0)
wird zuerst mit zuerst verglichen0
und mit bewertetFalse
. Ein Tupel wird dann mit diesem Ergebnis und zuletzt erstellt0
, so dass Sie erhalten(False, 0)
.Fall 2:
0, 0 == (0, 0)
Ein Tupel wird mit
0
als erstem Element konstruiert . Für das zweite Element wird die gleiche Prüfung wie im ersten Fall durchgeführt und ausgewertetFalse
, so dass Sie erhalten(0, False)
.Fall 3:
(0, 0) == (0, 0)
Wie Sie sehen, vergleichen Sie hier nur diese beiden
(0, 0)
Tupel und kehren zurückTrue
.quelle
Eine andere Möglichkeit, das Problem zu erklären: Sie sind wahrscheinlich mit Wörterbuchliteralen vertraut
und Array-Literale
und Tupelliterale
Was Sie jedoch nicht erkennen, ist, dass im Gegensatz zu Wörterbuch- und Array-Literalen die Klammern, die Sie normalerweise um ein Tupelliteral herum sehen, nicht Teil der Literal-Syntax sind . Die Literal-Syntax für Tupel ist nur eine Folge von Ausdrücken, die durch Kommas getrennt sind:
(eine "exprlist" in der Sprache der formalen Grammatik für Python ).
Was erwarten Sie nun vom Array-Literal?
zu bewerten? Das sieht wahrscheinlich viel mehr , wie es soll das gleiche sein wie
was natürlich zu bewertet
[0, False]
. Ebenso mit einem explizit in Klammern gesetzten Tupelliterales ist nicht überraschend zu bekommen
(0, False)
. Die Klammern sind jedoch optional.ist das gleiche. Und deshalb bekommst du
(0, False)
.Wenn Sie sich fragen, warum die Klammern um ein Tupelliteral optional sind, liegt dies hauptsächlich daran, dass es ärgerlich wäre, Destrukturierungszuweisungen auf diese Weise schreiben zu müssen:
quelle
Wenn Sie der Reihenfolge, in der Aktionen ausgeführt werden, einige Klammern hinzufügen, können Sie die Ergebnisse möglicherweise besser verstehen:
Das Komma wird verwendet, um Ausdrücke zu trennen (mit Klammern können wir natürlich ein anderes Verhalten erzwingen). Wenn Sie die aufgelisteten Snippets anzeigen,
,
wird sie durch Komma getrennt und definiert, welche Ausdrücke ausgewertet werden:Auf
(0, 0)
ähnliche Weise kann das Tupel auch zerlegt werden. Das Komma trennt zwei Ausdrücke, die aus den Literalen bestehen0
.quelle
Im ersten macht Python ein Tupel aus zwei Dingen:
(0, 0) == 0
, der zu ausgewertet wirdFalse
0
Im zweiten ist es umgekehrt.
quelle
Schauen Sie sich dieses Beispiel an:
dann Ergebnis:
dann erfolgt der Vergleich nur mit der ersten Zahl (0 und r) im Beispiel.
quelle