Skip to main content
 首页 » 编程设计

python之多个和/或在一个表达式中

2025年05月04日13kerrycode

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