Python运算符优先级 - 和vs大于

时间:2015-07-15 04:06:54

标签: python operator-precedence

我的脚本中有一行代码,它们将这两个操作符链接在一起。从文档参考 BOOLEAN AND 的优先级低于比较大于的优先级。我在这段代码中得到了意想不到的结果:

>>> def test(msg, value):
...     print(msg)
...     return value

>>> test("First", 10) and test("Second", 15) > test("Third", 5)
First
Second
Third
True

我期待第二次或第三次测试发生在第一次测试之前,因为>运算符具有更高的优先级。我在这里做错了什么?

https://docs.python.org/3/reference/expressions.html#operator-precedence

2 个答案:

答案 0 :(得分:7)

因为你看错了。 call(或函数调用)对and以及>(大于)的优先级更高。因此,第一个函数调用从左到右进行。

Python会在比较发生之前获得所有函数调用的结果。唯一优先考虑的是短路,所以如果test("First",10)返回False,它会短路并返回False。

比较和and仍然出现在相同的优先级中,首先将test("Second", 15)的结果与test("Third", 5)进行比较(请注意仅返回值(函数调用已经发生)之前))。然后在test("Second", 15) > test("Third", 5)操作中使用and的结果。

来自operator precedence -

的文档

enter image description here

答案 1 :(得分:3)

了解发生了什么的一种方法是仔细研究Python如何解释这个结果:

>>> x = lambda: test("First", 10) and test("Second", 15) > test("Third", 5)
>>> dis.dis(x)
  1           0 LOAD_GLOBAL              0 (test)
              3 LOAD_CONST               1 ('First')
              6 LOAD_CONST               2 (10)
              9 CALL_FUNCTION            2
             12 JUMP_IF_FALSE_OR_POP    42
             15 LOAD_GLOBAL              0 (test)
             18 LOAD_CONST               3 ('Second')
             21 LOAD_CONST               4 (15)
             24 CALL_FUNCTION            2
             27 LOAD_GLOBAL              0 (test)
             30 LOAD_CONST               5 ('Third')
             33 LOAD_CONST               6 (5)
             36 CALL_FUNCTION            2
             39 COMPARE_OP               4 (>)
        >>   42 RETURN_VALUE        

如果您对10 and 15 > 5执行相同操作,则会获得:

>>> x = lambda: 10 and 15 > 5
>>> dis.dis(x)
  1           0 LOAD_CONST               1 (10)
              3 JUMP_IF_FALSE_OR_POP    15
              6 LOAD_CONST               2 (15)
              9 LOAD_CONST               3 (5)
             12 COMPARE_OP               4 (>)
        >>   15 RETURN_VALUE