关于boolean:在Python中False == 0和True == 1是一个实现细节还是由语言保证?

Is False == 0 and True == 1 in Python an implementation detail or is it guaranteed by the language?

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

1
2
3
0 == False  # True
1 == True   # True
['zero', 'one'][False]  # is 'zero'

任何提及官方文件都将不胜感激!

编辑:如许多答案所述,bool继承自int。因此,问题可以被重新定义为:"文档是否正式说明程序员可以依赖从整数继承的布尔值,其值为01"?。此问题与编写不会因实现细节而失败的健壮代码有关!


在python 2.x中,这是不保证的,因为可能会重新分配TrueFalse。但是,即使发生了这种情况,布尔值true和布尔值false仍会正确返回以进行比较。

在python 3.x中,TrueFalse是关键字,并且始终等于10

在python 2和python 3的正常情况下:

False对象是bool类型,是int的一个子类:

1
2
3
4
5
object
   |
 int
   |
 bool

这是在您的示例中,['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出现之前你是安全的。-)


链接到讨论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上,不管怎样,情况总是这样。


很简单。因为bool将整数作为bool进行计算,所以只有零给出了错误的答案。所有非零值、浮点数、整数(包括负数)或您拥有的值都将返回true。

一个很好的例子来说明为什么这是有用的,那就是确定设备的电源状态。on是任何非零值,off是零。从电子角度讲,这是有道理的。

要相对地确定值之间的"真"或"假",您必须要将其与之进行比较。这适用于字符串和数值,使用==!=<>>=<=等。

您可以将一个整数赋给一个变量,然后根据该变量值得到true或false。


只要写int(False)就可以得到0,如果你输入int(True)它就会输出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。

1
2
>>> 0 is False
False