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

Eri*_*got 230 python boolean equality language-specifications

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

0 == False  # True
1 == True   # True
['zero', 'one'][False]  # is 'zero'
Run Code Online (Sandbox Code Playgroud)

任何对官方文档的引用都将非常感谢!

编辑:正如许多答案所述,bool继承自int.因此,问题可以改写为:"文档是否正式表明程序员可以依赖于从整数继承的布尔值,以及值01?".这个问题与编写由于实现细节而不会失败的健壮代码有关!

Oli*_*ier 173

在Python 2.x的,这是没有保证的,因为它是可能的True,并False重新分配.但是,即使发生这种情况,仍然可以正确返回布尔值True和布尔值False进行比较.

在Python 3.X TrueFalse是关键字,将始终等于10.

在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出现之前你是安全的.;-)

  • Nitpick:任何提供`__index__`方法的对象都可以用作列表索引; 不仅仅是`int`或`long`的子类. (20认同)
  • Re:"在Python 2.x中,这不能保证,因为可以重新分配True和False".恕我直言,虽然这是真的,任何重新分配真或假的人都应该得到任何奇怪的后果.具体来说,在重新分配之前存储True,然后在重新分配后将结果与True进行比较会中断.`a =真; 是的''我是个白痴'; a == True` => False.除了这样的重新分配,默认值标准化为0和1,我相信通常的做法是依赖于此; 例如,索引到一个双元素数组,其中[0]保持虚假情况,[1]为真. (4认同)
  • 0 == 0.0返回True,而['零','一'] [0.0]失败.['zero','one'] [False]有效,因为bool是int的子类.(int .__ subclasses __()返回[<type'bool'>]) (2认同)

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上,无论如何都会如此.

  • Re"True可能有任何其他价值.我不一定会依赖任何保证True == 1".实际上,你可以依赖于True == 1,根据http://www.python.org/dev/peps/pep-0285/和规范http://docs.python.org/2/reference/datamodel. html#the-standard-type-hierarchy"在几乎所有的上下文中,布尔值的行为分别类似于值0和1 ......"我并不是说通过重新分配True或False来覆盖Py 2中是不可能的,但我要说的是,除非你的项目中的一些程序员是白痴并进行这样的重新分配,否则行为是有保证的. (3认同)