32 votes

Pourquoi `True == False is False` est-il évalué à False?

J'ai un comportement assez inattendu sur une expression qui fonctionne avec == mais pas avec is :

 >>> (True == False) is False
True
>>> True == (False is False)
True
>>> True == False is False
False
>>> id(True)
8978640
>>> id(False)
8978192
>>> id(True == False)
8978192
>>> id(False is False)
8978640
 

40voto

jorgeca Points 2702

Parce qu'en fait c'est une comparaison enchaînée , donc

 True == False is False
 

est équivalent à

 (True == False) and (False is False)
 

Cela peut être surprenant dans ce cas, mais vous permet d’écrire 1 <= x < 4 contrairement à d’autres langues comme C.

12voto

Ashwini Chaudhary Points 94431

À partir de la docs:

x < y <= z est équivalent à x < y et y <= z, sauf que y est évaluées qu'une seule fois (mais dans les deux cas, z n'est pas évaluée lors de l' x < y est fausse).

Dans votre cas True == False is False est équivalent à True == False and False is False comme la première condition est - False donc c'courts-circuits et de revenir False.

>>> dis.dis(lambda : True == False is False)
  1           0 LOAD_GLOBAL              0 (True)
              3 LOAD_GLOBAL              1 (False)
              6 DUP_TOP             
              7 ROT_THREE           
              8 COMPARE_OP               2 (==)
             11 JUMP_IF_FALSE_OR_POP    21          <---------this step
             14 LOAD_GLOBAL              1 (False)
             17 COMPARE_OP               8 (is)
             20 RETURN_VALUE        
        >>   21 ROT_TWO             
             22 POP_TOP             
             23 RETURN_VALUE  

4voto

Josay Points 917

De la documentation :

5.9 Des comparaisons

Contrairement à C, toutes les opérations de comparaison en Python ont la même priorité, qui est inférieure à celle de toute opération arithmétique, décalée ou binaire. De plus, contrairement à C, les expressions comme a <b <c ont une interprétation conventionnelle en mathématiques:

 comparison    ::=  or_expr ( comp_operator or_expr )*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
                   | "is" ["not"] | ["not"] "in"
 

3voto

BrenBarn Points 63718

True == False is False est une comparaison chaînée, ce qui signifie la même chose que (True == False) and (False is False) . Comme la première comparaison ( True==False ) est fausse, le résultat de la comparaison chaînée est faux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X