True 和 False 是 int 的子类,底层值为 1 和 0,支持所有整数操作但语义上应避免滥用;type(True) is int 为 False,isinstance(True, int) 为 True;JSON 序列化会丢失类型信息。

为什么 isinstance(True, int) 返回 True
因为 bool 在 Python 中确实是 int 的子类,不是语法糖或兼容性补丁,而是 CPython 源码里明确定义的继承关系。这决定了 True 和 False 本质是 int 的两个特例实例。
实操上要注意:所有对 int 成立的操作(比如加减、格式化、位运算),对 bool 都合法——但不意味着应该这么做。
-
True + 1得到2,False * 100是0,这不是 bug,是设计使然 -
bool的__repr__和__str__被重写成显示True/False,但底层值仍是1和0 - 用
type(True) is int判断会失败(返回False),必须用isinstance(True, int)
issubclass(bool, int) 为真,但 bool 为何只有两个值
子类不等于“可扩展”。bool 类在初始化时强制拦截所有输入,只允许生成 True 或 False:
bool(2) # → True bool(-1) # → True bool(0) # → False
它复用了 int 的数值行为,但封死了构造任意整数实例的路径。
Python v2.4版chm格式的中文手册,内容丰富全面,不但是一本手册,你完全可以把她作为一本Python的入门教程,教你如何使用Python解释器、流程控制、数据结构、模板、输入和输出、错误和异常、类和标准库详解等方面的知识技巧。同时后附的手册可以方便你的查询。
立即学习“Python免费学习笔记(深入)”;
-
bool的__new__方法直接调用int.__new__,但传入的值被__bool__逻辑归约成0或1 - 你无法通过继承
bool创建第三个布尔值,class TriBool(bool): pass不会改变这个限制 - 这种设计让
if x:和x and y等逻辑操作能复用已有的整数比较与短路规则,无需额外实现
在类型提示和运行时检查中容易误判的地方
静态类型检查器(如 mypy)通常把 bool 当作独立类型处理,但运行时 isinstance(x, int) 对 bool 实例返回 True,这会导致不一致。
- 写
def f(x: int) -> None:时,传入True不会触发 mypy 报错(mypy 默认允许bool→int协变) - 但若函数内部做了
assert isinstance(x, int) and not isinstance(x, bool),这种判断是错的——bool就是int的子类 - 真正安全的类型区分方式是:
type(x) is bool(精确匹配),或isinstance(x, bool)(含子类,但bool没有公开子类)
实际项目里该不该依赖 bool 是 int 子类
可以读,不要写;可以观察,不要利用。
- 用
int(True)转换没问题,这是明确支持的隐式转换 - 但避免写
if x == 1:来判断布尔值——它在x = True时成立,但语义模糊,且当x = 1(纯整数)时也会误触发 - 序列索引中用
my_list[flag](flag是bool)是常见且安全的,因为True就是1,False就是0,但前提是列表长度 ≥ 2 - 最易忽略的坑:JSON 序列化时
True变成true(小写),而int(True)是1,序列化后变成数字1——类型信息彻底丢失







