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
>>> dis.dis(compile("(0, 0) == 0, 0", '', 'exec'))
1 0 LOAD_CONST 2 ((0, 0))
3 LOAD_CONST 0 (0)
6 COMPARE_OP 2 (==)
9 LOAD_CONST 0 (0)
12 BUILD_TUPLE 2
15 POP_TOP
16 LOAD_CONST 1 (None)
19 RETURN_VALUE
(0, 0)
wird zuerst mit zuerst verglichen 0
und mit bewertet False
. Ein Tupel wird dann mit diesem Ergebnis und zuletzt erstellt 0
, so dass Sie erhalten (False, 0)
.
Fall 2: 0, 0 == (0, 0)
>>> dis.dis(compile("0, 0 == (0, 0)", '', 'exec'))
1 0 LOAD_CONST 0 (0)
3 LOAD_CONST 0 (0)
6 LOAD_CONST 2 ((0, 0))
9 COMPARE_OP 2 (==)
12 BUILD_TUPLE 2
15 POP_TOP
16 LOAD_CONST 1 (None)
19 RETURN_VALUE
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 ausgewertet False
, so dass Sie erhalten (0, False)
.
Fall 3: (0, 0) == (0, 0)
>>> dis.dis(compile("(0, 0) == (0, 0)", '', 'exec'))
1 0 LOAD_CONST 2 ((0, 0))
3 LOAD_CONST 3 ((0, 0))
6 COMPARE_OP 2 (==)
9 POP_TOP
10 LOAD_CONST 1 (None)
13 RETURN_VALUE
Wie Sie sehen, vergleichen Sie hier nur diese beiden (0, 0)
Tupel und kehren zurück True
.