En Python (j'ai vérifié uniquement avec Python 3.6 mais je pense que cela devrait également s'appliquer à de nombreuses versions précédentes):
(0, 0) == 0, 0 # results in a two element tuple: (False, 0)
0, 0 == (0, 0) # results in a two element tuple: (0, False)
(0, 0) == (0, 0) # results in a boolean True
Mais:
a = 0, 0
b = (0, 0)
a == b # results in a boolean True
Pourquoi le résultat diffère-t-il entre les deux approches? L'opérateur d'égalité gère-t-il les tuples différemment?
la source
,
se lie moins étroitement que==
.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
(0, 0)
est d'abord comparé au0
premier et évalué àFalse
. Un tuple est ensuite construit avec ce résultat et le dernier0
, donc vous obtenez(False, 0)
.Cas 2:
0, 0 == (0, 0)
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)
Ici, comme vous le voyez, vous comparez simplement ces deux
(0, 0)
tuples et revenezTrue
.la source
Une autre façon d'expliquer le problème: vous êtes probablement familier avec les littéraux de dictionnaire
et littéraux de tableau
et littéraux tuple
mais ce que vous ne réalisez pas, c'est que, contrairement aux littéraux de dictionnaire et de tableau, les parenthèses que vous voyez habituellement autour d'un littéral de tuple ne font pas partie de la syntaxe littérale . La syntaxe littérale des tuples est juste une séquence d'expressions séparées par des virgules:
(une "exprlist" dans le langage de la grammaire formelle pour Python ).
Maintenant, qu'attendez-vous du littéral du tableau
évaluer? Cela ressemble probablement beaucoup plus à ce que cela devrait être le même que
ce qui évalue bien sûr à
[0, False]
. De même, avec un littéral de tuple explicitement entre parenthèsesce n'est pas surprenant de l'obtenir
(0, False)
. Mais les parenthèses sont facultatives;Est la même chose. Et c'est pourquoi vous obtenez
(0, False)
.Si vous vous demandez pourquoi les parenthèses autour d'un littéral de tuple sont facultatives, c'est en grande partie parce qu'il serait ennuyeux d'avoir à écrire des affectations de déstructuration de cette façon:
la source
L'ajout de quelques parenthèses autour de l'ordre dans lequel les actions sont effectuées peut vous aider à mieux comprendre les résultats:
La virgule est utilisée pour séparer les expressions (en utilisant des parenthèses, nous pouvons forcer un comportement différent, bien sûr). Lors de l'affichage des extraits de code que vous avez répertoriés, la virgule
,
les séparera et définira les expressions qui seront évaluées:Le tuple
(0, 0)
peut également être décomposé de la même manière. La virgule sépare deux expressions comprenant des littéraux0
.la source
Dans le premier, Python crée un tuple de deux choses:
(0, 0) == 0
, qui évalueFalse
0
Dans le second, c'est l'inverse.
la source
regardez cet exemple:
puis résultat:
alors la comparaison ne concerne que le premier nombre (0 et r) de l'exemple.
la source