在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中。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出现之前,你是安全的。: -)