Ce que vous voyez dans les 3 instances est une conséquence de la spécification grammaticale du langage et de la façon dont les jetons rencontrés dans le code source sont analysés pour générer l'arbre d'analyse.
Jetez un œil à ce code de bas niveau devrait vous aider à comprendre ce qui se passe sous le capot. Nous pouvons prendre ces instructions python, les convertir en code octet puis les décompiler à l'aide du dis
module:
Cas 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)
est d'abord comparé au 0
premier et évalué à False
. Un tuple est ensuite construit avec ce résultat et le dernier 0
, donc vous obtenez (False, 0)
.
Cas 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
Un tuple est construit avec 0
comme premier élément. Pour le deuxième élément, la même vérification est effectuée que dans le premier cas et évaluée à False
, donc vous obtenez (0, False)
.
Cas 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
Ici, comme vous le voyez, vous comparez simplement ces deux (0, 0)
tuples et revenez True
.