You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套字典场景下外部字典删除回收后的Python内存行为咨询

问题解答:Python嵌套字典的内存回收情况

核心结论

原outer字典占用的大部分内存会被归还系统,只有被second_book直接引用的那个子字典({'name': 'The Source', 'author': 'Michener'}),以及该子字典引用的字符串对象('The Source'、'Michener')会保留在内存中,其余部分(outer字典本身、books列表、另外三本书籍的字典、'John Smith'字符串等)都会被垃圾回收。

具体原理分析

Python以引用计数作为核心垃圾回收机制:当对象的引用计数降至0时,其占用的内存会被自动释放;仅存在循环引用的场景才需要依赖gc模块处理。结合你的操作步骤拆解:

  1. 初始引用关系:
    • outer变量指向外层字典对象;
    • 外层字典同时引用'John Smith'字符串和books列表;
    • books列表引用4个子字典;
    • 每个子字典各自引用对应的name和author字符串。
  2. 赋值second_book后:
    第二个子字典的引用计数从1(仅被列表引用)变为2(列表引用 + second_book引用)。
  3. 删除outer并执行垃圾回收:
    • del outer移除了对外层字典的唯一引用,外层字典引用计数归0,随即被回收;
    • 外层字典被回收后,books列表的引用计数也归0(仅外层字典曾引用它),列表对象被回收;
    • 列表被回收后,除第二个子字典外,另外三个子字典的引用计数全部归0,因此它们会被回收;
    • 'John Smith'字符串如果没有其他外部引用,引用计数也会归0,同样被回收;
    • 第二个子字典因second_book仍在引用它,引用计数为1,所以不会被回收;它内部的字符串因被子字典引用,也会保留在内存中。

关于gc.collect()返回0的说明

你执行gc.collect()返回0,是因为当前场景不存在循环引用,所有可回收对象已经通过引用计数机制自动清理,gc模块没有需要额外处理的对象,这是正常现象。

内容的提问来源于stack exchange,提问作者teejay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 21:43:11