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
我的脚本中有一行代码将这两个运算符链接在一起。根据文档参考,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