Python中Immortal Objects(永久对象)工作原理及相关疑问
聊聊PEP 683:用固定引用计数实现“永生”对象
先搞懂核心逻辑:Python为啥要搞“永生”对象?
Python里的对象靠引用计数管内存——一个对象被引用一次,计数加1;引用消失,计数减1,减到0就被回收。但像None、True、False这种全局独一份的对象,从解释器启动到关闭一直存在,根本不需要被回收。以前它们的引用计数还是会被反复修改,反而多了没必要的操作,还可能引发底层bug。
什么是“永生”对象?
PEP 683给这类对象加了个特殊标记:把它们的引用计数固定成一个超大的数(比如2^64-1)。这样一来:
- 不管怎么引用、取消引用,计数都不会变,永远不会减到0,也就永远不会被回收
- 解释器不用再给它们做计数修改的操作,能省点性能开销
为啥选None、True、False这些?
这些对象天生就是不可变+全局唯一的:
- 不可变:你没法把
True改成False,它们的值从出生就定死了 - 全局唯一:整个Python程序里,
None就只有一个,你写一万个None,指向的都是同一个内存地址
举个实际例子验证:
a = None b = None print(a is b) # 输出True,说明a和b是同一个对象
如果每次用None都新创建一个,那a is b会返回False,但实际是True,因为它们共享同一个“永生”对象。
这么做有啥好处?
- 性能优化:少了很多引用计数修改的操作,尤其是频繁用到这些对象的场景
- 避免bug:以前有些极端情况(比如多线程下修改引用计数)可能导致这些全局对象被误回收,现在完全不会有这问题
- 逻辑更合理:这些对象本来就该一直存在,用“永生”标记正好匹配它们的生命周期
内容的提问来源于stack exchange,提问作者Talha Tayyab
相关产品推荐
相关产品推荐

