在Python中是否保证False == 0
和True == 1
(假设它们未被用户重新分配)?例如,无论Python的版本(现有的,可能的,未来的版本)如何,以任何方式保证以下代码始终会产生相同的结果?
0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero'
非常感谢任何对官方文档的引用!
修改:正如许多答案所述,bool
继承自int
。因此,问题可以改写为:“文档是否正式表示程序员可以依赖于从整数继承的布尔值,其值为0
和1
?”。这个问题与编写由于实现细节而不会失败的健壮代码有关!
答案 0 :(得分:164)
在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的版本都是如此。docs for python 2.6和docs for Python 3都说:
有两种类型的整数:[...] Integers(int)[...] Booleans(bool)
并在布尔子部分中:
布尔值:这些表示真值False和True [...]布尔值在几乎所有上下文中的行为分别类似于值0和1,例外的是当转换为字符串时,字符串“False”或者分别返回“True”。
还有for Python 2:
在数值上下文中(例如,当用作算术运算符的参数时),它们[False和True]的行为分别与整数0和1相似。
因此,在Python 2.6和3中,布尔值被明确地视为整数。
所以在Python 4出现之前你是安全的。 ; - )
答案 1 :(得分:70)
链接到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
答案 2 :(得分:22)
在Python 2.x中,根本不保证:
>>> False = 5
>>> 0 == False
False
所以它可能会改变。在Python 3.x中,True,False和None都是reserved words,因此上面的代码不起作用。
一般情况下,对于布尔值,你应该假设False总是有一个0的整数值(只要你不改变它,如上所述),True可以有任何其他值。我不一定会依赖True==1
的任何保证,但是对于Python 3.x,无论如何都会如此。
答案 3 :(得分:-1)
非常简单。由于布尔值与将整数评估为布尔值有关,因此只有零给出错误的答案。所有非零值,浮点数,整数(包括负数)或具有的所有内容都将返回true。
为什么这有用的一个很好的例子是确定设备的电源状态。 On是任何非零值,off是零。从电子上讲,这是有道理的。
要相对确定值之间的正确或错误,必须具有一些可比较的值。这适用于使用==
或!=
或<
,>
>=
,<=
等的字符串和数字值。
您可以为变量分配一个整数,然后根据该变量值获得true或false。
答案 4 :(得分:-2)
只需撰写int(False)
即可获得0
,如果您输入int(True)
,则会输出1
答案 5 :(得分:-5)
假是一个博尔。它有不同的类型。它是一个与0不同的对象,它是一个整数。
0 == False
返回True,因为False被强制转换为整数。 int(False)返回0
==运算符的python文档说(help('==')):
运算符
<
,>
,==
,>=
,<=
和!=
比较两个对象的值。对象不必具有相同的类型。如果两者都是数字,则将它们转换为通用类型。
因此,为了比较的需要,将False转换为整数。但它与0不同。
>>> 0 is False
False