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

Vik*_*ahl 3 python python-2.x operator-precedence

可能重复:
为什么表达式0 <0 == 0在Python中返回False?

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

>>> 15>10==True
False
>>> 15>1==True
True
>>> 15>2==True
False
>>> 15>False
True
Run Code Online (Sandbox Code Playgroud)

如果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对我有意义.

简介:在Python 2中,为什么15>10==True评估False

K Z*_*K Z 5

这是因为Python中的链式比较.即,15>10==True实际上被评估为:

15 > 10 and 10 == True
Run Code Online (Sandbox Code Playgroud)

是的False.

另一方面,15>1==True是一样的

15 > 1 and 1 == True
Run Code Online (Sandbox Code Playgroud)

评估为True.


引用文档:

与C不同,Python中的所有比较操作都具有相同的优先级,低于任何算术,移位或按位操作的优先级.与C不同,像<b <c这样的表达式具有在数学中常规的解释:

comparison    ::=  or_expr ( comp_operator or_expr )*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
                   | "is" ["not"] | ["not"] "in"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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