Lo que ve en las 3 instancias es una consecuencia de la especificación gramatical del lenguaje y de cómo se analizan los tokens encontrados en el código fuente para generar el árbol de análisis.
Echar un vistazo a este código de bajo nivel debería ayudarlo a comprender lo que sucede debajo del capó. Podemos tomar estas declaraciones de Python, convertirlas en código de bytes y luego descompilarlas usando el dis
módulo:
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)
primero se compara con el 0
primero y se evalúa como False
. Luego se construye una tupla con este resultado y por último 0
, por lo que se obtiene (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 se construye con 0
el primer elemento. Para el segundo elemento, se realiza la misma verificación que en el primer caso y se evalúa para False
obtener (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
Aquí, como puede ver, solo está comparando esas dos (0, 0)
tuplas y regresando True
.