我是Python的新手,并尝试Python逻辑语句。我遇到了这个我无法理解的。可以告诉我在Python 2.7中发生了什么。有什么区别0和Python中的错误值。布尔Python值混淆
>>> 0 or False False >>> False or 0 0
为什么口译员给出了不同的答案?
我是Python的新手,并尝试Python逻辑语句。我遇到了这个我无法理解的。可以告诉我在Python 2.7中发生了什么。有什么区别0和Python中的错误值。布尔Python值混淆
>>> 0 or False False >>> False or 0 0
为什么口译员给出了不同的答案?
您对or
运算符的行为感到困惑;它返回第一个表达式,只有它是一个true值;既不0
也不False
为真,从而返回第二个值:
>>> 0 or 'bar'
'bar'
>>> False or 'foo'
'foo'
任何值不是数值0,一个空的容器,None
或False
被认为是真实的(自定义类可以通过实现__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或为假 错误如何为真? –
我不喜欢这个答案,因为“它返回第一个表达式为真”的理由不能完全解释行为。类似于“它通过操作数并返回第一个表达式是True或最后一个操作数遇到的”,而不那么优雅,会更好地解释遇到的行为。 –
@WaleedKhan:调整了措辞。 –
此行为的性质以python的顺序expression evaluation
。 Python从左向右评估表达式,它在lazy manner中执行。这意味着,一个解释器达到了这一点,当表达式的值为True
时,无论表达式的其余部分如何,它都将遵循与表达式相关的工作流分支。如果没有一个表达式是True
,它将简单地返回最近的(最后一个)。这提供了节省计算资源的好处。请看下面的代码:
>>>False or False or True or range(10**8)
True
>>>
注意,即range(10**8)
是从来没有在这种情况下调用,因此,大量的时间被保存。
请注意,这两个值都是“虚假”;也就是说,他们都在if语句中评估为“False”。 –