表达式中的多个和/或

2024-05-17 18:24:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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)中我看不到一致的行为。你知道吗

案例1

如果我们按照(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)

Tags: orandfalsetruefooonasit
3条回答

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

检查优先级:http://docs.python.org/reference/expressions.html#summary

它将在每一个情况下在or之前对and进行评估。你知道吗

1 or 2 and 3==1 or (2 and 3)

你的问题来了,因为你相信andor仅仅是右联想,它们之间没有优先权。你知道吗

andor之前求值。你知道吗

1 and 2 or 3>;2

1 or 2 and 3>;1

>>> def foo():
...   print 'foo'
...   return 0
...
>>> def bar():
...   print 'bar'
...   return 1
...
>>> def baz():
...   print 'baz'
...   return 2
...
>>> foo() and bar() or baz()
foo
baz
2

相关问题 更多 >