我的脚本中有一行代码,它们将这两个操作符链接在一起。从文档参考 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
答案 0 :(得分:7)
因为你看错了。 call
(或函数调用)对and
以及>
(大于)的优先级更高。因此,第一个函数调用从左到右进行。
Python会在比较发生之前获得所有函数调用的结果。唯一优先考虑的是短路,所以如果test("First",10)
返回False,它会短路并返回False。
比较和and
仍然出现在相同的优先级中,首先将test("Second", 15)
的结果与test("Third", 5)
进行比较(请注意仅返回值(函数调用已经发生)之前))。然后在test("Second", 15) > test("Third", 5)
操作中使用and
的结果。
答案 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