python不严格类型检查bool

时间:2013-12-24 06:45:59

标签: python

我一直都知道python有严格的类型检查 -

>>> 1 + 'hello'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

这很好,因为我们不能将int添加到字符串

但为什么允许以下内容?

>>> True + False
1
>>> True + 0
1

为什么在将int添加到布尔值时不支持严格检查?

4 个答案:

答案 0 :(得分:8)

>>> issubclass(bool, int)
True

这解释了一切。也就是说,boolint的子类。这就是为什么你可以在允许bool的任何地方使用int

有很多细节,see the PEP that introduced the type

编辑:光泽

请注意,Python在其生命的前十年没有bool类型。从概念上讲,“真/假”操作通常返回1或0。并且Python程序员经常利用它,比如K&amp; R C程序员利用它。例如,

sum(x < 2 for x in some_list)

返回some_list中小于2的元素数。添加bool类型时,必须更改<等运算符以返回True或{ {1}}相反,但依赖于1或0返回值的巨大数量的代码将被破坏。这是False为什么成为bool子类型的一个关键原因,仅限于值0和1(使用更高级的名称intFalse)。

答案 1 :(得分:6)

因为Python的布尔类型是整数的子类。

答案 2 :(得分:1)

True or False只评估为:

>>> 1 or 0
1

True + 0评估同样的事情

例如:

>>> int(True)
1
>>> int(False)
0

or语句返回True,如果其中一个参数为True

答案 3 :(得分:1)

PEP 285:

  

本PEP建议引入一种新的内置类型bool,       有两个常量,False和True。布尔类型将是一个       int类型的直接子类型(在C中)和值       False和True在大多数方面表现得像0和1(对于       例如,False == 0和True == 1将为真)除了repr()和       STR()。概念上返回布尔值的所有内置操作       结果将被更改为返回False或True而不是0或1;       例如,比较,“not”运算符和谓词之类的       isinstance()。

这是可能的,因为True is also 1False is also 0(反之亦然):

>>> 1 + False
1
>>>
>>> 1 + 1
2
>>> True + 2
3
>>> False
False
>>> False + 4
4
>>>
>>> type(True+1)
<type 'int'>
>>>

您还必须知道None type0不相符:

>>> None + True
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'bool'
>>>
>>> None is 0
False