布尔值Python值混淆

时间:2013-11-04 22:13:27

标签: python python-2.7 boolean

我是Python的新手,在尝试Python逻辑语句时。我遇到过这个我无法理解的问题。任何人都可以告诉我在Python 2.7中发生了什么。在Python中0和False值之间的区别是什么

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

为什么翻译会给出不同的答案?

2 个答案:

答案 0 :(得分:6)

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

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

任何非数字0的值,空容器NoneFalse都被认为是真的(自定义类可以通过实现__bool__方法(python 3)来改变它,{ {1}}(python 2)或__nonzero__(长度0为空)。

如果第一个表达式是__len__

,则甚至不评估第二个表达式
True

>>> True or 1 / 0 True 表达式会引发1 / 0异常,但Python甚至不会对其进行评估。

boolean operators documentation

中记录了这一点
  

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

同样,y返回第一个表达式and,否则返回第二个表达式。

答案 1 :(得分:1)

此行为的性质是python的expression evaluation顺序。 Python从左到右评估表达式 ,并在lazy manner中进行评估。这意味着,当表达式的值为True时,无论表达式的其余部分是什么,解释器都会到达该点,它将遵循与表达式相关联的工作流的分支。如果所有表达式都不是True,则只会返回 最近的(最后一个) 。这提供了节省计算资源的好处。请考虑以下代码:

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

注意,在这种情况下永远不会调用range(10**8),因此节省了大量时间。