可能重复:
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}}?
答案 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