是否保证在python中使用False == 0和True == 1(假设用户没有重新分配它们)?例如,是否以任何方式保证以下代码将始终产生相同的结果,不管Python的版本是什么(既有版本,也可能是将来的版本)?
1 2 3
| 0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero' |
任何提及官方文件都将不胜感激!
编辑:如许多答案所述,bool继承自int。因此,问题可以被重新定义为:"文档是否正式说明程序员可以依赖从整数继承的布尔值,其值为0和1"?。此问题与编写不会因实现细节而失败的健壮代码有关!
- @S.lott:有很多理由问上面的问题。因此,有些情况下,依赖布尔值为整数会使代码更简单:您必须更改它吗?或者,您可能会在由其他人编写的代码中发现依赖布尔值为整数的位置:您是为了"修复"现有代码而中断正在修改的代码,还是可以确保当前的代码是健全的?还有很多其他的例子。更一般地说,了解游戏规则是很好的,这样你就可以玩得很好,程序也很好。
- @EOL:您能提供一个"依赖布尔值为整数使代码更简单"的例子吗?我无法想象这样的事情。"您是否中断正在修改的代码以"修复"现有代码,或者您是否可以放心当前的代码是健全的?这个问题似乎是技术性的,而不是"我该如何应对?"规则很简单:不依赖于实现细节。那么,为什么要询问实现细节呢?
- @S.lott:最初的帖子正好与您的观点相呼应:问题本质上是"这是一个实现细节吗?"因为我完全同意你的观点,即一个人不应该依赖于实现细节。如果布尔值是已知值的正式整数,那么问题中的代码不依赖于实现细节,这是好的。
- @S.Lot:知道false==0和true==1可以更容易地计算一个序列中有多少个bool是真的:您只需编写sum(bool_list)。否则,你就得写sum(1 for x bool_list if x)。
- @丹:那是计算布尔值的一种方法。我想说,bool_list.count(True)更明确,速度也快了3倍……:)
- 将布尔值视为整数是一个类型错误。如果python有类型。我不会在代码中出错。
- @答案显示,python booleans实际上是(特定的子类)整数。而且,python显然有类型;也许您的意思是它是"非静态类型"?此外,我不确定您所说的"我不会在代码中出错"是什么意思。现在,我从不喜欢将布尔值与整数混合,因为它们在概念上是不同的,我不介意Python布尔值是否不是整数,但知道它们是0和1,这是有用的。
在python 2.x中,这是不保证的,因为可能会重新分配True和False。但是,即使发生了这种情况,布尔值true和布尔值false仍会正确返回以进行比较。
在python 3.x中,True和False是关键字,并且始终等于1和0。
在python 2和python 3的正常情况下:
False对象是bool类型,是int的一个子类:
这是在您的示例中,['zero', 'one'][False]起作用的唯一原因。它不适用于非整数子类的对象,因为列表索引只适用于整数或定义__index__方法的对象(感谢Mark Dickinson)。
编辑:
当前的python版本和python 3版本都是如此。python 2.6和python 3的文档都说:
There are two types of integers: [...] Integers (int) [...] Booleans (bool)
在布尔子部分中:
Booleans: These represent the truth values False and True [...] Boolean values behave like the values 0 and 1, respectively, in almost all contexts, the exception being that when converted to a string, the strings"False" or"True" are returned, respectively.
对于python 2,还有:
In numeric contexts (for example when used as the argument to an arithmetic operator), they [False and True] behave like the integers 0 and 1, respectively.
所以booleans在python 2.6和3中被显式地视为整数。
所以在python 4出现之前你是安全的。-)
- 0==0.0返回true,而['Zero'、'One'、[0.0]失败。由于bool是int的一个子类,[zero'、'one'、[false]起作用。(int.u subclassesuuu()返回[])
- 挑剔:任何提供__index__方法的对象都可以用作列表索引,而不仅仅是int或long的子类。
- 啊,是的,它也在那里。但是最好不要链接到python 3.0文档:3.0已经死了。:)
- 回复:"在python 2.x中,这是不保证的,因为可能会重新分配true和false。"imho,虽然这是真的,但是任何重新分配真或假的人都应该得到他们得到的任何奇怪的结果。具体来说,在重新分配之前存储true,然后在重新分配之后将结果与true进行比较,这将中断。a = True; True = 'i am an idiot'; a == True=>错误。除了这种重新分配之外,默认值被标准化为0和1,我相信依赖于它是常见的做法;例如,索引到一个两元素数组,其中[0]包含错误的情况,[1]为真。
- 我刚刚注意到另一个官方确认的事实,即在实践中真可以被视为1和假0:docs.python.org/2/library/stdttypes.html布尔值。我要在这个答案中加上这个。
链接到讨论python 2.3中新bool类型的pep:http://www.python.org/dev/peps/pep-0285/。
将bool转换为int时,整数值始终为0或1,但将int转换为bool时,除0之外的所有整数的布尔值都为真。
1 2 3 4 5 6 7 8 9 10
| >>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False |
在python 2.x中,根本无法保证:
1 2 3
| >>> False = 5
>>> 0 == False
False |
所以它可以改变。在python 3.x中,true、false和none都是保留字,因此上面的代码不起作用。
一般来说,对于布尔值,您应该假设尽管false总是有一个0的整数值(只要您不更改它,如上所述),但true可以有任何其他值。我不一定要依赖于任何保证True==1,但是在python 3.x上,不管怎样,情况总是这样。
- "真"可以有任何其他值。我不一定要依靠任何保证,真的==1"。实际上,根据python.org/dev/peps/pep-0285和spec docs.python.org/2/reference/&hellip,您可以依赖于true==1;"布尔值在几乎所有的上下文中分别表现为值0和1…"我并不是说在py 2中不可能通过重新分配true或false来覆盖它,但我是说,除非Project是一个白痴,做这样的重新分配,行为是有保证的。
很简单。因为bool将整数作为bool进行计算,所以只有零给出了错误的答案。所有非零值、浮点数、整数(包括负数)或您拥有的值都将返回true。
一个很好的例子来说明为什么这是有用的,那就是确定设备的电源状态。on是任何非零值,off是零。从电子角度讲,这是有道理的。
要相对地确定值之间的"真"或"假",您必须要将其与之进行比较。这适用于字符串和数值,使用==或!=或<、>>=和<=等。
您可以将一个整数赋给一个变量,然后根据该变量值得到true或false。
- 问题是真的==1是否由python保证,而不是整数的布尔值。
只要写int(False)就可以得到0,如果你输入int(True)它就会输出1。
- 这只意味着假和真是int()的有效输入,具有简单的数字意义,而不是它们与0和1完全相同。
错误是一种错误。它有不同的类型。它是一个不同于0的整数对象。
0 == False返回true,因为false被强制转换为整数。int(false)返回0
==运算符的python文档显示(帮助("=="):
The operators <, >, ==, >=, <=, and != compare the values of two objects. The objects need not have the same type. If both are numbers, they are converted to a common type.
因此,为了比较的需要,将false转换为整数。但它不同于0。
- 这并不完全正确:bool是int的一个子类,所以在实际意义上,bool是一个整数。例如,isinstance(True, int)返回true。相等性检查不会将bool转换为int,因为不需要转换:它直接调用int.__cmp__。注意,bool.__cmp__ is int.__cmp__的计算结果也为True。
- -这个答案是1。bool和int之间关系的描述不正确(在python 2中)。isinstance(True, int)=>正确。也就是说,true是一个整数,不需要转换。
- 我有一个脚本返回了假或int…使用while response is False有效,而while response == False无效。谢谢!
- 0 is False是假的,对你没有任何影响。在交互式解释器中,输入x = -10,然后输入y = -10,然后输入x is y,这也是错误的。因为python解释器在某些情况下(将整型文字存储为常量,插入小整型)重新使用相同的整型对象,这并不意味着当您想要测试整型值相等性时,应该使用is。