274

是否保证False == 0and True == 1, 在 Python 中(假设它们没有被用户重新分配)?例如,是否以任何方式保证以下代码将始终产生相同的结果,无论 Python 的版本是什么(现有的和可能的未来版本)?

0 == False  # True
1 == True   # True
['zero', 'one'][False]  # is 'zero'

任何对官方文档的参考将不胜感激!

编辑:正如许多答案中所述,bool继承自int. 因此,这个问题可以改写为:“文档是否正式说程序员可以依赖从整数继承的布尔值,以及值01?”。这个问题与编写不会因实现细节而失败的健壮代码有关!

4

3 回答 3

213

在 Python 2.x 中,这不能保证,因为它可以重新分配TrueFalse重新分配。但是,即使发生这种情况,布尔 True 和布尔 False 仍会正确返回以进行比较。

在 Python 3.x中TrueandFalse是关键字,并且总是等于1and 0

在 Python 2 中的正常情况下,在 Python 3 中总是:

Falseobject 的类型bool是以下的子类int

object
   |
 int
   |
 bool

['zero', 'one'][False]这是在您的示例中起作用的唯一原因。它不适用于不是整数子类的对象,因为列表索引仅适用于整数或定义__index__方法的对象(感谢mark-dickinson)。

编辑:

当前的 python 版本和 Python 3 的版本都是如此。python 2文档和 Python 3的文档都说:

整数有两种类型: [...] 整数 (int) [...] 布尔 (bool)

在布尔小节中:

布尔值:它们代表真值 False 和 True [...] 在几乎所有上下文中,布尔值的行为分别类似于值 0 和 1,例外的是当转换为字符串时,字符串“False”或“True” " 分别返回。

还有,对于 Python 2

在数字上下文中(例如,当用作算术运算符的参数时),它们 [False 和 True] 的行为分别类似于整数 0 和 1。

所以布尔值在 Python 2 和 3 中被明确地视为整数。

所以在 Python 4 出现之前你是安全的。;-)

于 2010-05-04T09:18:01.243 回答
83

这是 PEP 讨论 Python 2.3 中新的 bool 类型:http: //www.python.org/dev/peps/pep-0285/

将 bool 转换为 int 时,整数值始终为 0 或 1,但将 int 转换为 bool 时,布尔值对于除 0 以外的所有整数均为 True。

>>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False
于 2010-05-04T09:16:50.583 回答
22

在 Python 2.x 中,根本无法保证:

>>> False = 5
>>> 0 == False
False

所以它可能会改变。在 Python 3.x 中,True、False 和 None 是保留字,所以上面的代码不起作用。

一般来说,对于布尔值,你应该假设 False 总是有一个整数值 0(只要你不改变它,如上所述), True 可以有任何其他值。我不一定会依赖任何保证True==1,但在 Python 3.x 上,无论如何都会如此。

于 2010-05-04T09:33:16.840 回答