我对Python如何评估布尔语句感到困惑。
对于前。
False and 2 or 3
返回3
如何评估?我认为Python首先看'False和2',并且在没有看'或3'的情况下返回False。 Python在这里看到的顺序是什么?
另一个是:
1 or False and 2 or 2 and 0 or 0
返回1
从我从第一个例子中收集到的,我认为Python将从左到右进行评估,因此'1或False'将返回1,然后'1和2'将返回2,然后'2或2'将返回前2,然后'2和0'将返回0,然后'0或0'将返回第二个0。
你可以告诉我在这里非常困惑,请帮忙!
谢谢!
答案 0 :(得分:10)
and
的优先级高于or
。
False and 2 or 3
评估为
((False and 2) or 3)
由于第一部分(False and 2)
是False
,Python必须评估第二部分以查看整个条件是否仍然可以成为True
。它可以,因为3
计算结果为True
,所以返回此操作数。
类似于1 or False and 2 or 2 and 0 or 0
,评估为
(1 or ((False and 2) or ((2 and 0) or 0)))
由于1
的计算结果为True
,因此无论其他操作数具有哪个值,整个条件都将为True
。 Python可以在此时停止评估,并再次返回确定最终值的操作数。
确定最终结果的最早结果称为short-circuit evaluation,可以描述如下:
每当确定表达式的最终结果时,停止评估,并在Python中返回确定最终值的操作数的值。也就是说,假设从左到右的评估:
and
运算符,最左边的操作数,其值为False
(或最后一个)or
运算符,最左边的操作数,其值为True
(或最后一个)答案 1 :(得分:3)
这里的问题是有一个评估订单,and
has a higher precedence than or
。因此,它们在这里从左到右进行评估。
鉴于此,False and 2 or 3
为python,(False and 2) or 3
- 因此评估为False or True
,然后评估为True
。
在下一个示例中,Python短路,1 or False
评估为True
1
,因此返回1
。其余的从未得到评估。这很有道理,好像or
的一部分是True
,你知道整个事情必须 - 所以为什么还要做额外的工作呢?
检查这个的一个好方法是定义打印的函数:
>>> def test(x):
... print("Test: "+str(x))
... return x
...
>>> test(1) or test(0) or test(3)
Test: 1
1
>>> test(0) or test(0) or test(3)
Test: 0
Test: 0
Test: 3
3
>>> test(False) and test(2) or test(3)
Test: False
Test: 3
3
>>> test(1) or test(False) and test(2) or test(2) and test(0) or test(0)
Test: 1
1
这样可以很容易地看到评估的内容和顺序。
答案 2 :(得分:3)
请查看本页第5.15节:http://docs.python.org/reference/expressions.html
or
的优先级低于and
,因此您的语句评估为
(false and 2) or 3
答案 3 :(得分:2)
我在python docs页面上读了一段时间。如果我找到了,我会发布参考文献。 它陈述了一些内容,在一个布尔语句中,Python将返回第一个True对象。因此....并且用False预先堕落,但是或者只有一个参数,即3(真)。
答案 4 :(得分:2)
评估如下:
result = (False and 2) or 3
所以基本上如果False and 2
为true-ish,则返回,否则返回3
。