我一直都知道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添加到布尔值时不支持严格检查?
答案 0 :(得分:8)
>>> issubclass(bool, int)
True
这解释了一切。也就是说,bool
是int
的子类。这就是为什么你可以在允许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(使用更高级的名称int
和False
)。
答案 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 1
和False is also 0
(反之亦然):
>>> 1 + False
1
>>>
>>> 1 + 1
2
>>> True + 2
3
>>> False
False
>>> False + 4
4
>>>
>>> type(True+1)
<type 'int'>
>>>
您还必须知道None type
与0
不相符:
>>> 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