1. Python 对象底层结构
What(是什么)
Python 是用 C 语言写的。你在 Python 里创建的每一个对象(数字、字符串、列表……),底层都是一个 C 语言的结构体(struct),里面维护着一些关键信息。
就像一个快递包裹,外表看起来是你的东西,但快递公司会在包裹外面贴一张快递单,上面记录着寄件人、收件人、重量等信息。Python 对象也一样,每个对象都附带着一张"元信息单",记录着:
| 字段 | 含义 |
|---|---|
ob_refcnt | 引用计数:有多少个变量在用它 |
ob_type | 类型:这个对象是 int、float 还是 str |
_ob_next | 指向上一个对象的指针 |
_ob_prev | 指向下一个对象的指针 |
这个结构体叫PyObject,是 Python 中所有对象的"公共头部"。如果对象还包含多个元素(如列表、元组),还会在PyObject基础上加上一个ob_size字段,形成PyVarObject结构体。
Why(为什么需要这些字段)
- 引用计数:用来判断这个对象是否还有人用,没人用了就可以回收内存。
- 类型:让 Python 知道这个对象能做什么操作(int 能加减,str 能拼接)。
- 双向链表指针:Python 把所有创建的对象都串在一条双向链表
refchain上,方便统一管理。
就像学校把所有学生档案串成一本花名册,新生入学就加进去,毕业就移除。Python 创建对象时加到refchain,销毁时移除。
How(怎么验证)
创建对象的过程(底层自动完成):
1. 开辟内存 2. 初始化: ob_refcnt = 1 # 至少有一个变量引用它 ob_type = float # 类型 ob_fval = 3.14 # 值 3. 将对象加入双向链表 refchain: _ob_next = 上一个对象 _ob_prev = 下一个对象业务场景:理解 Python 变量赋值和内存关系
Web后端重要性:⭐⭐
面试:★★
面试题:Python 对象底层包含哪些信息?
答:通过PyObject结构体维护四个关键字段:引用计数、类型指针、上一个对象指针、下一个对象指针。所有对象通过_ob_next和_ob_prev串在refchain双向链表中。
2. Python 缓存机制
2.1 小整数对象池
What(是什么)
Python 启动时,会提前创建好-5到256之间的所有整数对象(共 262 个)。程序中任何用到这个范围内整数的地方,都直接复用这些预先创建好的对象,不会重新开辟内存。
就像学校提前印好了一堆“1号教室”、“2号教室”的门牌,每次需要用某个门牌号,直接拿现成的,不用重新做。
Why(为什么需要)
整数是程序中使用最频繁的类型之一。如果每次用到100都临时创建一个新对象,用完又销毁,会频繁地申请和释放内存,拖慢程序速度。预先创建好,直接用现成的,大幅提升效率。
小整数对象池不会被垃圾回收。
How(怎么验证)
a=100print(id(a))# 例如:140705185112832dela# 删除变量 ab=100print(id(b))# 140705185112832 ← 和 a 的内存地址一样!注意:-5到256之外的整数(即 ≥257 或 ≤ -6),每次创建都会生成新的对象:
a=257b=257