Python 内存管理
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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2594228.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!