在Python中是False == 0和True == 1的实现细节,还是由语言保证的?

在Python中保证False == 0True == 1吗? 举例来说,不pipePython的版本(包括现有的和未来的版本),下面的代码总能产生相同的结果吗?

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

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

编辑 :正如在许多答案中指出的, boolintinheritance。 因此,这个问题可以被重写为:“文档是否正式说过程序员可以依赖于从整数inheritance的布尔值,值为01 ?”。 这个问题是相关的编写健壮的代码,不会因为实现细节而失败!

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

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

一般情况下在Python 2中,总是在Python 3中:

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

 object | int | bool 

这是在你的例子中, ['zero', 'one'][False]确实有效的唯一原因。 它不适用于一个不是整数子类的对象,因为列表索引只能用整数或定义__index__方法的对象(感谢mark-dickinson )。

编辑:

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

有两种types的整数:[…]整数(int)[…]布尔(bool)

并在布尔子部分:

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

所以在Python 2.6和Python 3中,布尔值被明确地认为是整数。

所以你是安全的,直到Python 4出现。 😉

链接到PEP讨论Python 2.3中的新booltypes: 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中,根本不能保证:

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

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

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

假是一个傻瓜。 它有不同的types。 这是一个不同于0的对象,它是一个整数。

0 == False返回True,因为False被转换为整数。 int(False)返回0

==运算符的python文档(help('==')):

运算符<>==>=<=!=比较两个对象的值。 对象不必具有相同的types。 如果两者都是数字,则它们被转换为通用types。

结果,为了比较的需要,将False转换为整数。 但它不同于0。

 >>> 0 is False False