web-dev-qa-db-fra.com

Pourquoi (1 dans [1,0] == True) est-il évalué à False?

Quand je regardais les 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 doublon 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 regardant 0 < 0 == 0, Vous pouvez imaginer que chaque moitié est évaluée et a un sens en tant qu'expression:

>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True

Le lien explique donc 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
150
Peter Wood

Python applique ici le chaînage d'opérateurs de comparaison. L'expression est traduite en

(1 in [1, 0]) and ([1, 0] == True)

qui est évidemment False.

Cela se produit également pour des expressions telles que

a < b < c

qui se traduisent par

(a < b) and (b < c)

(sans évaluer b deux fois).

Voir la documentation du langage Python pour plus de détails.

190
Sven Marnach