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

Python False==0和True==1是一个实现细节,还是由语言保证?,python,boolean,equality,language-specifications,Python,Boolean,Equality,Language Specifications,在Python中,假设用户没有重新分配False==0和True==1,是否可以保证它们?例如,无论Python的现有版本和将来的版本是什么,是否以任何方式保证以下代码将始终产生相同的结果 0 == False # True 1 == True # True ['zero', 'one'][False] # is 'zero' 请参考官方文件,不胜感激 编辑:正如许多答案中所指出的,bool继承自int。因此,这个问题可以重新表述为:文档是否正式说明程序员可以依赖从整数继承的boole

在Python中,假设用户没有重新分配False==0和True==1,是否可以保证它们?例如,无论Python的现有版本和将来的版本是什么,是否以任何方式保证以下代码将始终产生相同的结果

0 == False  # True
1 == True   # True
['zero', 'one'][False]  # is 'zero'
请参考官方文件,不胜感激


编辑:正如许多答案中所指出的,bool继承自int。因此,这个问题可以重新表述为:文档是否正式说明程序员可以依赖从整数继承的boolean,值为0和1?。这个问题与编写不会因为实现细节而失败的健壮代码有关

链接到讨论Python 2.3中新bool类型的政治公众人物:

将布尔值转换为整数时,整数值始终为0或1,但将整数转换为布尔值时,布尔值对于除0以外的所有整数均为真

>>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False
在Python2.x中,这是不能保证的,因为可能会重新分配True和False。然而,即使发生这种情况,布尔真和布尔假仍然会正确返回以进行比较

在Python3.x中,True和False是关键字,始终等于1和0

在Python2和Python3中的正常情况下:

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

这是在您的示例中,['zero','one'][False]起作用的唯一原因。它不适用于不是integer子类的对象,因为列表索引只适用于整数或定义方法的对象

编辑:

当前的python版本和Python3版本都是如此。双方都说:

有两种类型的整数:[…]整数int[…]布尔布尔

在boolean小节中:

布尔值:它们表示真值False和True[…]布尔值在几乎所有上下文中的行为分别类似于值0和1,例外情况是当转换为字符串时,分别返回字符串False或True

还有:

例如,在数值上下文中,当用作算术运算符的参数时,它们[假和真]的行为分别类似于整数0和1

因此,在Python2和Python3中,布尔值被显式地视为整数


所以在Python 4出现之前,您是安全的-

在Python 2.x中,根本不能保证:

>>> False = 5
>>> 0 == False
False
所以它可以改变。在Python3.x中,True、False和None都是,因此上面的代码不起作用


一般来说,对于布尔型,您应该假设,只要不更改,False的整数值始终为0,如上所述,True可以有任何其他值。我不必依赖于任何True==1的保证,但在Python3.x上,无论发生什么情况,情况总是如此。

0==0.0返回True,而['zero','one'][0.0]失败。['zero','one'][False]之所以有效,是因为bool是int.int的一个子类。uuu subclasses\uuuuuuuuu返回[]挑剔:任何提供uuu index\uuuuuu方法的对象都可以用作列表索引;不仅仅是int或long的子类。啊,是的,它也在那里。但最好不要链接到Python 3.0文档:3.0已经死了Re:在Python2.x中,这是不能保证的,因为可能会重新分配True和False。我知道,虽然这是真的,但是任何重新分配真或假的人都应该得到他们得到的任何奇怪的结果。具体来说,在重新分配之前存储True,然后在重新分配之后将结果与True进行比较,这将导致中断。a=真;真的=‘我是个白痴’;a==真=>假。除了这样的重新分配,默认值被标准化为0和1,我相信依赖于这一点是常见的做法;e、 g.若要索引到一个两元素数组中,其中[0]包含false,则[1]为true。我刚刚注意到另一个官方确认的事实,即true实际上可以被视为1和false 0:。我在回答这个问题时加上这个。@S.Lott:有很多理由提出上述问题。因此,在某些情况下,依赖布尔值作为整数会使代码更简单:您必须更改它吗?或者,您可能会发现其他人编写的代码中存在依赖布尔值为整数的地方:您是否会中断代码中正在修改的内容以修复现有代码,或者您是否可以确保当前的代码是正确的?还有很多其他的例子。更一般地说,了解游戏规则是很好的,这样你就可以很好地玩游戏并以合理的方式编程。@S.Lott:原始帖子正好回应了你的观点:问题本质上是这是一个实现细节吗?因为我完全同意你的观点,即不应该依赖于实现细节。如果布尔值是已知值的正式整数,那么问题中的代码不依赖于实现细节
s、 这很好。@s.Lot:知道False==0和True==1可以更容易地计算一个序列中有多少布尔是真的:您只需编写sumbool\u列表。否则,如果x的话,你必须为x bool_列表写sum1。@dan:这是计算布尔数的一种方法。我想说bool_list.countTrue更明确;它也快了大约3倍…:@akonsu正如答案所示,Python布尔实际上是一个特定的整数子类。此外,Python显然有类型;也许你的意思是它不是静态类型的?另外,我不确定您所说的“我不会在代码中出错”是什么意思。现在,我从不喜欢将布尔值与整数混合,因为它们在概念上是不同的,我也不介意Python布尔值是否不是整数,但知道它们是整数(值为0和1)非常有用。Re True可以有任何其他值。我不必依赖任何保证True==1。实际上,在几乎所有上下文中,您都可以依赖True==1,而spec布尔值的行为分别类似于值0和1。。。我并不是说在Py 2中不可能通过重新指定True或False来覆盖这一点,但我是说,除非项目中的某个程序员是个白痴并进行了这样的重新指定,否则这种行为是有保证的。顺便说一句,有时切换太python风格会有问题。例如:```如果不是2!=2:
>>> False = 5
>>> 0 == False
False