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