运算符优先级:> 和 ==

18

我正在尝试猜测哪个运算符具有优先级:>(大于)还是 ==(等于)。这是我的实验:

>>> 5 > 4 == 1
False
据我所知,这有两种可能的解决方案。
>>> (5 > 4) == 1
True
>>> 5 > (4 == 1)
True

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


你可以查一下,但是因为质疑一个(也许)违反直觉的结果而加1分。 - geometrian
1个回答

26

这与操作符链有关。与C/C++和大多数其他语言不同,Python允许您像正常数学运算一样链接比较运算符。来自文档

比较可以任意链接,例如,x < y <= z等价于x < y and y <= z,只是在第一种情况下y只被评估一次(但在两种情况下都不会在x < y被发现为假时评估z)。

因此,这个表达式:

5 > 4 == 1

实际上被解释为:

5 > 4 and 4 == 1  # Except that 4 is only evaluated once.

这将变成:

True and False

这是False


使用括号改变了Python对你的比较的解释。这个:
(5 > 4) == 1

变成:

True == 1

这是因为它是True(请参见下文)。同样适用于:

5 > (4 == 1)

转换为:

5 > False

这也是真的


由于PEP 0285的原因,bool被作为int的子类,并且True == 1,而False == 0
>>> issubclass(bool, int)
True
>>> True == 1
True
>>> False == 0
True
>>>

这是文档的链接,仅供参考:https://docs.python.org/2/reference/expressions.html#boolean-operations - mp_
2
@iCodez 链式解释是 5 > 4 并且 4 == 1。 - ryanpattison
有趣!非常感谢。 - cdonts
1
"历史原因"让它看起来像是向后兼容性的一个无意的怪癖;实际上,这是按设计工作的。 - Veedrac
@Veedrac - 我一直认为这是为了与C/C++的布尔类型保持一致(是的,我知道C有一段时间没有bool类型,但许多人会做类似于typedef enum { false, true } bool;的事情来实现相同的结果)。不过我会改变措辞,因为这只是一种包含PEP链接的方式。 :) - user2555451

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接