Ce que vous voyez dans tous les 3 cas, c'est une conséquence de la spécification de la grammaire de la langue, et la manière dont les pions rencontrés dans le code source sont analysés afin de générer l'arbre d'analyse.
Prendre un coup d'oeil à ce faible niveau de code devrait vous aider à comprendre ce qui se passe sous le capot. Nous pouvons prendre ces instructions python, les convertir en code octet, puis de les décompiler l'aide de l' dis
module de:
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 première par rapport à l' 0
d'abord évaluée False
. Un tuple est alors construit avec ce résultat et dernier 0
, de sorte que vous obtenez de l' (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 le premier élément. Pour le deuxième élément, la même vérification est faite comme dans le premier cas et évaluée afin d' False
, de sorte que vous obtenez de l' (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 êtes juste en comparant ces deux (0, 0)
n-uplets et de revenir True
.