Lorsque j'ai cherché des réponses à cette question , j'ai constaté que je ne comprenais pas ma propre réponse.
Je ne comprends pas vraiment comment cela est analysé. Pourquoi le deuxième exemple renvoie-t-il False?
>>> 1 in [1,0] # This is expected
True
>>> 1 in [1,0] == True # This is strange
False
>>> (1 in [1,0]) == True # This is what I wanted it to be
True
>>> 1 in ([1,0] == True) # But it's not just a precedence issue!
# It did not raise an exception on the second example.
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
1 in ([1,0] == True)
TypeError: argument of type 'bool' is not iterable
Merci pour toute aide. Je pense que je dois rater quelque chose de vraiment évident.
Je pense que c'est subtilement différent du duplicata lié:
Pourquoi l'expression 0 <0 == 0 renvoie False en Python? .
Les deux questions concernent la compréhension humaine de l'expression. Il semblait y avoir deux façons (à mon avis) d'évaluer l'expression. Bien sûr, ni l'un ni l'autre n'étaient corrects, mais dans mon exemple, la dernière interprétation est impossible.
En 0 < 0 == 0
vous regardant, vous pourriez imaginer que chaque moitié est évaluée et a un sens en tant qu'expression:
>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True
Ainsi, le lien répond pourquoi cela évalue False
:
>>> 0 < 0 == 0
False
Mais avec mon exemple 1 in ([1,0] == True)
n'a pas de sens en tant qu'expression, donc au lieu qu'il y ait deux interprétations possibles (certes erronées), une seule semble possible:
>>> (1 in [1,0]) == True
la source
==
liaison est plus étroite quein
, donc[1,0] == True
est évaluée en premier, puis le résultat de cela est alimenté1 in other_result
.Réponses:
Python applique ici le chaînage d'opérateurs de comparaison. L'expression est traduite en
ce qui est évidemment
False
.Cela se produit également pour des expressions telles que
qui se traduisent par
(sans évaluer
b
deux fois).Consultez la documentation du langage Python pour plus de détails.
la source
1 in [1, 0] == [1, 0]
évalue àTrue
.in
opérateur ait une priorité plus élevée que les autres opérateurs de comparaison et qu'il n'enchaîne pas. Mais il me manque peut-être un cas d'utilisation.in
- après tout a dux < y < z
sens, mais pas tellement avecx in y in z
in
cela, ce n'est tout simplement plus le cas et le rend assez contre-intuitif.