在Python中是False == 0和True == 1的实现细节,还是由语言保证的?
在Python中保证False == 0
和True == 1
吗? 举例来说,不pipePython的版本(包括现有的和未来的版本),下面的代码总能产生相同的结果吗?
0 == False # True 1 == True # True ['zero', 'one'][False] # is 'zero'
任何参考官方文件将非常感谢!
编辑 :正如在许多答案中指出的, bool
从int
inheritance。 因此,这个问题可以被重写为:“文档是否正式说过程序员可以依赖于从整数inheritance的布尔值,值为0
和1
?”。 这个问题是相关的编写健壮的代码,不会因为实现细节而失败!
在Python 2.x中,这是不能保证的,因为True
和False
可能被重新分配。 但是,即使发生这种情况,boolean True和boolean False仍然可以正确返回以进行比较。
在Python 3.x中, True
和False
是关键字,并且始终等于1
和0
。
一般情况下在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