【问题标题】:Priority of operators: > and == [duplicate]运算符的优先级:> 和 == [重复]
【发布时间】:2014-11-09 23:00:30
【问题描述】:

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

>>> 5 > 4 == 1
False

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

>>> (5 > 4) == 1
True
>>> 5 > (4 == 1)
True

都不返回False,那么第一个代码是如何被Python解析的呢?

【问题讨论】:

  • 你可以查一下,但是 +1 用于质疑(可能)违反直觉的结果。

标签: python boolean operators operator-precedence


【解决方案1】:

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

比较可以任意链接,例如,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

这也是True


由于PEP 0285bool 成为intTrue == 1 的子类,而False == 0

>>> issubclass(bool, int)
True
>>> True == 1
True
>>> False == 0
True
>>>

【讨论】:

  • 这里是文档的链接,仅供参考:docs.python.org/2/reference/expressions.html#boolean-operations
  • @iCodez 链接的解释是 5 > 4 和 4 == 1
  • 有趣!非常感谢。
  • “历史原因”使它看起来像是一个意外的向后兼容性怪癖;实际上是working by design
  • @Veedrac - 我一直认为这样做是为了与 C/C++ 布尔值保持一致(是的,我知道 C 有一段时间没有布尔类型,但很多人会这样做类似typedef enum { false, true } bool; 来达到相同的结果)。不过,我会更改措辞,因为它实际上只是包含 PEP 链接的一种方式。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 2016-06-17
  • 1970-01-01
相关资源
最近更新 更多