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

Python operator precedence - and vs greater than

我的脚本中有一行代码将这两个运算符链接在一起。根据文档参考,BOOLEAN AND 的优先级低于 COMPARISON GREATER THAN。我在这段代码中得到了意想不到的结果:

>>> 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

因为你看错了。 call(或函数调用)比 and>(大于)都具有更高的优先级。所以第一个函数调用是从左到右发生的。

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

and 的比较仍然以相同的优先级发生,即首先将 test("Second", 15) 的结果与 test("Third", 5) 进行比较(请注意仅 return 值(函数调用之前已经发生))。然后test("Second", 15) > test("Third", 5)的结果用在and运算中。

来自 operator precedence 上的文档 -

查看正在发生的事情的一种方法是查看 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