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

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

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

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


当前回答

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

在Python 3中。x True和False是关键字,永远等于1和0。

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

False对象的类型为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出现之前,你是安全的。: -)

其他回答

下面是Python 2.3中讨论新的bool类型的PEP: 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这是不保证的,因为True和False有可能被重新分配。然而,即使发生这种情况,布尔True和布尔False仍然会正确返回以进行比较。

在Python 3中。x True和False是关键字,永远等于1和0。

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

False对象的类型为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出现之前,你是安全的。: -)

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

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

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

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