Eri*_*got 230 python boolean equality language-specifications
难道保证False == 0和True == 1,在Python(假设他们没有被用户重新分配)?例如,无论Python的版本(现有的,可能的,未来的版本)是什么,它是否以任何方式保证以下代码将始终产生相同的结果?
0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero'
Run Code Online (Sandbox Code Playgroud)
任何对官方文档的引用都将非常感谢!
编辑:正如许多答案所述,bool继承自int.因此,问题可以改写为:"文档是否正式表明程序员可以依赖于从整数继承的布尔值,以及值0和1?".这个问题与编写由于实现细节而不会失败的健壮代码有关!
Oli*_*ier 173
在Python 2.x的,这是没有保证的,因为它是可能的True,并False重新分配.但是,即使发生这种情况,仍然可以正确返回布尔值True和布尔值False进行比较.
在Python 3.X True和False是关键字,将始终等于1和0.
在Python 2中的正常情况下,始终在Python 3中:
Falseobject的类型bool是以下的子类int:
object
|
int
|
bool
Run Code Online (Sandbox Code Playgroud)
这是你的例子中唯一有效的原因['zero', 'one'][False].它不适用于不是整数子类的对象,因为列表索引仅适用于整数或定义__index__方法的对象(感谢mark-dickinson).
编辑:
对于当前的python版本和Python 3的版本都是如此.python 2.6的文档和Python 3的文档都说:
有两种类型的整数:[...]整数(int)[...]布尔(bool)
并在布尔子部分中:
布尔值:这些表示真值False和True [...]布尔值在几乎所有上下文中的行为分别类似于值0和1,例外的是当转换为字符串时,字符串"False"或"True" "分别归还.
因此,在Python 2.6和3中,布尔值被明确地视为整数.
所以在Python 4出现之前你是安全的.;-)
Eri*_*and 72
链接到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
Run Code Online (Sandbox Code Playgroud)
Dan*_*l G 22
在Python 2.x中,它根本不能保证:
>>> False = 5
>>> 0 == False
False
Run Code Online (Sandbox Code Playgroud)
所以它可能会改变.在Python 3.x中,True,False和None是保留字,因此上述代码不起作用.
一般来说,对于布尔值,您应该假设False将始终具有0的整数值(只要您不更改它,如上所述),True可以具有任何其他值.我不一定会依赖任何保证True==1,但在Python 3.x上,无论如何都会如此.