【问题标题】:Order of operations Incorrect?操作顺序不正确?
【发布时间】:2017-03-03 20:38:49
【问题描述】:

我使用的是 Python 3.5.2 shell。我很困惑为什么会这样?

5 > 5**2
False
5 > 5**2 == False
False
(5 > 5**2) == False
True

操作的顺序定义了**在>之前执行,>在==之前,所以它应该可以工作。

【问题讨论】:

    标签: python python-3.x python-3.5


    【解决方案1】:

    有趣的问题!出现这种行为的原因是 Python 中的所有比较运算符都具有相同的优先级和 can be chained

    所以你的第二个比较相当于

    5 > 25 and 25 == False

    当然评估为False。 但我同意在这种情况下,它不是很直观。

    【讨论】:

    • 您始终可以使用括号来覆盖此链接:(5 > 5**2) == False => True
    • @brianpck 是的,但你为什么要那样做?比较总是会产生一个布尔值(除非以非常非正统的方式重载),并将布尔值与例如对或错首先是不好的做法。而不是(5 > 5**2) == False,只需使用not (5 > 5**2)5 <= 5**2
    • @tobias_k,同意,但 OP(我希望!)的前提是实验,而不是实际的问题解决。我写了很多更奇怪的代码,只是为了掌握语言特性。
    • @tobias_k,您并不经常需要它,但有时您需要两个比较的 XOR 或 XNOR。例如,在验证排序数组的不变量时,if (i <= j) != (a[i] <= a[j]) 或类似的东西。
    【解决方案2】:

    5.15。运算符优先级

    下表总结了 Python 中的运算符优先级,从最低优先级(最少绑定)到最高优先级(最多绑定)。同一框中的运算符具有相同的优先级。除非明确给出语法,否则运算符是二元的。同一框中的运算符从左到右分组(除了比较,包括测试,它们都具有相同的优先级和从左到右的链 - 参见比较部分 - 和取幂,从右到左分组 )。

    5 Expressions - Python

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      相关资源
      最近更新 更多