Python bool 为何是 int 的子类

千明酱_9836

千明酱_9836

2026-02-10

537人浏览

原创

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

python bool 为何是 int 的子类

为什么 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 的数值行为,但封死了构造任意整数实例的路径。

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载
  • 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——类型信息彻底丢失

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2235

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3602

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1196

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

4139

7

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2235

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3602

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1196

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

4139

7

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2235

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程