运营商的优先级:>和==

cdo*_*nts 18 python boolean operators operator-precedence

我试图猜测哪个运营商具有优先权:( >大于)或==(相等).这是我的实验:

>>> 5 > 4 == 1
False
Run Code Online (Sandbox Code Playgroud)

据我所知,这有两种可能的解决方案.

>>> (5 > 4) == 1
True
>>> 5 > (4 == 1)
True
Run Code Online (Sandbox Code Playgroud)

两者都没有返回False,那么Python的第一个代码是如何解决的?

iCo*_*dez 26

这与操作员链接有关.与C/C++和大多数其他语言不同,Python允许您像在普通数学中一样链接比较运算符.从文档:

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

所以,这个表达式:

5 > 4 == 1
Run Code Online (Sandbox Code Playgroud)

实际上解释为:

5 > 4 and 4 == 1  # Except that 4 is only evaluated once.
Run Code Online (Sandbox Code Playgroud)

变为:

True and False
Run Code Online (Sandbox Code Playgroud)

是的False.


但是,使用括号会更改Python解释比较的方式.这个:

(5 > 4) == 1
Run Code Online (Sandbox Code Playgroud)

变为:

True == 1
Run Code Online (Sandbox Code Playgroud)

这是True(见下文为什么).同样适用于:

5 > (4 == 1)
Run Code Online (Sandbox Code Playgroud)

变为:

5 > False
Run Code Online (Sandbox Code Playgroud)

这也是True.


由于PEP 0285,bool作出的一个子类int,并True == 1同时False == 0:

>>> issubclass(bool, int)
True
>>> True == 1
True
>>> False == 0
True
>>>
Run Code Online (Sandbox Code Playgroud)

  • @iCodez用链接解释是5> 4和4 == 1 (2认同)