False == 0和True == 1是实现细节还是由语言保证?

是否保证Python中的False == 0True == 1(假设它们没有被用户重新分配)?例如,是否在某种程度上保证下面的代码总是产生相同的结果,无论Python的版本是什么(包括现有的和可能的未来版本)?

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

任何参考的官方文件将非常感激!

编辑:正如在许多答案中指出的那样,bool继承自int。因此,这个问题可以重新定义为:“文档是否正式地说程序员可以依赖从整数值__ABC2和1继承的布尔值?”这个问题与编写不会因为实现细节而失败的健壮代码有关!

313373 次浏览

下面是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

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

在Python 3中。x TrueFalse是关键字,始终等于10

在Python 2和Python 3的正常情况下:

False对象的类型是bool,它是int的子类:

    object
|
int
|
bool

这就是为什么在你的例子中,['zero', 'one'][False]可以工作的唯一原因。它不能用于不是整数子类的对象,因为列表索引只适用于整数或定义了__index__方法的对象(感谢马克·金森)。

编辑:

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

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

在布尔子节中:

布尔值:它们表示真值False和True[…]布尔值在几乎所有上下文中分别表现为值0和1,唯一的例外是当转换为字符串时,字符串"False"或“;True"分别返回。

还有适用于Python 2:

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

因此,在Python 2和3中,布尔值被显式地视为整数。

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

在Python 2中。X,完全不保证:

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

所以它可以改变。在Python 3中。x, True, False和None是保留字,所以上面的代码将无法工作。

一般来说,对于布尔值,你应该假设False总是有一个0的整数值(只要你不改变它,如上所述),True可以有任何其他值。我不一定依赖于True==1的任何保证,而是依赖于Python 3。X,无论什么情况,都是这样。