Ciò che vedi in tutti e 3 i casi è una conseguenza della specifica grammaticale del linguaggio e del modo in cui i token incontrati nel codice sorgente vengono analizzati per generare l'albero di analisi.
Dare un'occhiata a questo codice di basso livello dovrebbe aiutarti a capire cosa succede sotto il cofano. Possiamo prendere queste istruzioni python, convertirle in byte code e poi decompilarle usando il dis
modulo:
Caso 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)
viene prima confrontata con 0
prima e valutata con False
. Una tupla viene quindi costruita con questo risultato e dura 0
, quindi ottieni (False, 0)
.
Caso 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
Una tupla è costruita con 0
come primo elemento. Per il secondo elemento, viene eseguito lo stesso controllo del primo caso e valutato False
, quindi ottieni (0, False)
.
Caso 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
Qui, come vedi, stai solo confrontando quelle due (0, 0)
tuple e tornando True
.