Python中布尔表达式的意外结果

时间:2012-10-31 00:45:40

标签: python python-2.x operator-precedence

  

可能重复:
  Why does the expression 0 < 0 == 0 return False in Python?

Python 2 REPL的以下输出让我困惑:

>>> 15>10==True
False
>>> 15>1==True
True
>>> 15>2==True
False
>>> 15>False
True

如果将15>10==True评估为(15>10)==True,则表达式将简化为print True==True,这显然会计算为True。如果15>10==True被评估为15>(10==True),则表达式会简化为15>False,而True也会计算为False。这两种解释都与表达式的实际值相矛盾(15>1==True)。

我可以理解True评估为1==True,因为15>10==True是正确的,但对15>10==True的解释对我没有意义。

摘要:在Python 2中,为什么False评估为{{1}}?

2 个答案:

答案 0 :(得分:5)

这是因为Python中的chained comparison。即,15>10==True实际上被评估为:

15 > 10 and 10 == True

False

另一方面,15>1==True

相同
15 > 1 and 1 == True

评估为True


引用文档:

  

与C不同,Python中的所有比较操作都具有相同的优先级,低于任何算术,移位或按位操作的优先级。与C不同,表达式如同&lt; b&lt; c具有数学常规的解释:

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

比较产生布尔值:True或False。

     

比较可以任意链接,例如,x <1。 y&lt; = z等于x&lt; y和y&lt; = z,除了y仅被评估一次(但在两种情况下,当x&lt; y被发现为假时,根本不评估z。)

     

形式上,如果a,b,c,...,y,z是表达式而op1,op2,...,opN是比较运算符,那么op1 b op2 c ... y opN z相当于a op1 b和b op2 c和... y opN z,除了每个表达式最多被评估一次。

     

注意,op1 b op2 c并不意味着a和c之间的任何比较,因此例如x&lt; y&gt; z是完全合法的(尽管可能并不漂亮)。

答案 1 :(得分:2)

我相信你在不知不觉中遇到了python operators的“整洁”功能:

  

与C不同,表达式如&lt; b&lt; c具有数学常规的解释:

In [12]: 15>10==True
Out[12]: False

在此表达式中,True恰好被视为1,即:

In [13]: 15>10==1
Out[13]: False

然后用&gt;替换==运算符,我们根据上面引用的规则看到新表达式是如何真实的:

In [14]: 15>10>1
Out[14]: True