bool 是 int 的子类,因为 True 和 False 被设计为 int 的特例(True==1,False==0),继承链为 bool → int → object;isinstance(True, int) 返回 True,且 bool 不可实例化新值。

为什么 bool 是 int 的子类?
因为 Python 在设计上把 True 和 False 直接实现为 int 的两个特例实例:True == 1,False == 0,且它们的类型继承链就是 bool → int → object。这不是历史遗留包袱,而是有意为之的语义简化——布尔值本质上就是二元整数。
isinstance(True, int) 返回 True 吗?
返回 True。这是最直接的验证方式:
>>> isinstance(True, int) True >>> isinstance(False, int) True >>> issubclass(bool, int) True
这意味着所有对 int 成立的操作(比如加减、格式化、作为列表索引)在 bool 上也合法,哪怕语义上有点怪:
-
True + True得2(不是报错) -
[10, 20][False]取出10(因为False == 0) -
str(True)是'True',但'%d' % True是'1'
这种设计会引发什么实际问题?
主要出现在类型检查和序列化场景中,尤其当代码依赖“非整数布尔值”的直觉时:
本文档是python学习笔记与简明教程;为什么用Python作为编程入门语言?每种语言都会有它的支持者和反对者。去Google一下“why python”,你会得到很多结果,诸如应用范围广泛、开源、社区活跃、丰富的库、跨平台等等等等,也可能找到不少对它的批评,格式死板、效率低、国内用的人很少之类。不过这些优缺点的权衡都是程序员们的烦恼。作为一个想要学点编程入门的初学者来说,简单才是最重要的。当学C++的同学还在写链表,学Java的同学还在折腾运行环境的时候,学Pyt
立即学习“Python免费学习笔记(深入)”;
- 用
json.dumps()序列化含bool的字典没问题,但若手动做类型映射(如转成数据库字段),误把bool当普通int处理,可能把True存成1而丢失语义 -
typing.Union[int, bool]实际上等价于int,因为bool已被包含;真正想表达“整数或布尔”应写Union[int, bool]并配合运行时类型检查(如type(x) is bool) - 函数参数注解为
int,传入True不会报类型错误(mypy 默认也不警告),但逻辑可能出错
要不要在代码里依赖 bool 的整数值?
不建议主动依赖,除非明确需要数值行为(比如计数 True 出现次数)。Python 文档强调:bool 是 int 的子类,但它的主要用途是逻辑运算,不是算术运算。
容易被忽略的一点是:bool 类型不可实例化新值(bool(2) 返回 True,但 bool.__new__(bool, 2) 会报错),这说明它被刻意限制为仅表示两个状态——这个约束比“能当整数用”更本质。








