foo() 未定义。
>>> 0 and foo() (1)
0 # trivial
>>> 0 and foo() or 1 (2) # expecting it as 0 and (foo() or 1)
1 # does NOT short-circuit on 0
>>> 1 or foo() (3) # trivial
1
>>> 1 or foo() and 0 (4) # expecting it as 1 or (foo() and 0)
1 # DOES short-circuit on 1
我没有看到 (2) 和 (4) 的一致行为。
案例一
如果我们按照 (2) 的评估方式:
0 and foo() or 1
false or true (1)
true (1)
那么我期望 (4) 为:
1 or foo() and 0
true and false (0)
false (0)
案例2
如果我们按照 (4) 的评估方式:
1 or foo() and 0
true or ...
true (1)
那么我期望 (2) 为:
0 and foo() or 1
false and ...
false (0)
请您参考如下方法:
and 的优先级高于 or。
(2)
0 and foo() or 1 == (0 and foo()) or 1
== 0 or 1 # short-circuited, foo() never evaluated
== 1
(4)
1 or foo() and 0 == 1 or (foo() and 0)
== 1 # short-circuited, foo() never evaluated
