2013-11-04 104 views
5

我是Python的新手,并尝试Python逻辑语句。我遇到了这个我无法理解的。可以告诉我在Python 2.7中发生了什么。有什么区别0和Python中的错误值。布尔Python值混淆

 
>>> 0 or False 
False 
>>> False or 0 
0 

为什么口译员给出了不同的答案?

+0

请注意,这两个值都是“虚假”;也就是说,他们都在if语句中评估为“False”。 –

回答

6

您对or运算符的行为感到困惑;它返回第一个表达式,只有它是一个true值;既不0也不False为真,从而返回第二个值:

>>> 0 or 'bar' 
'bar' 
>>> False or 'foo' 
'foo' 

任何值不是数值0,一个空的容器,NoneFalse被认为是真实的(自定义类可以通过实现__bool__方法改变该(蟒3),__nonzero__(蟒2)或__len__(长度0是空的)

第二表达甚至没有评估如果第一是True

>>> True or 1/0 
True 

1/0表达式会引发ZeroDivision异常,但甚至不会由Python进行评估。

这是记录在boolean operators documentation

表达x or y首先评估x;如果x为真,则返回其值;否则,将评估y并返回结果值。

同样,and返回第一个表达式,如果它是False,否则返回第二个表达式。

+0

“它返回第一个表达式为真” 此处为0或为假 错误如何为真? –

+0

我不喜欢这个答案,因为“它返回第一个表达式为真”的理由不能完全解释行为。类似于“它通过操作数并返回第一个表达式是True或最后一个操作数遇到的”,而不那么优雅,会更好地解释遇到的行为。 –

+0

@WaleedKhan:调整了措辞。 –

1

此行为的性质以python的顺序expression evaluation。 Python从左向右评估表达式,它在lazy manner中执行。这意味着,一个解释器达到了这一点,当表达式的值为True时,无论表达式的其余部分如何,它都将遵循与表达式相关的工作流分支。如果没有一个表达式是True,它将简单地返回最近的(最后一个)。这提供了节省计算资源的好处。请看下面的代码:

>>>False or False or True or range(10**8) 
True 
>>> 

注意,即range(10**8)是从来没有在这种情况下调用,因此,大量的时间被保存。