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

如何在Python中实现字典无引用复制以释放内存?

解决方案

1. 澄清:不可变类型的赋值不存在“引用依赖”

你的示例中,id、c、d的值都是字符串——Python中不可变类型的赋值,本质是传递对象的引用,但因为不可变,原数据的修改不会影响新字典的值。更重要的是:当原字典(list_1、dict_2中的条目)被销毁时,只要没有其他变量持有原数据的引用,Python的垃圾回收机制会自动释放其内存。你观察到的内存未释放,大概率是原数据的引用还被其他变量持有,而非新字典的问题。

2. 显式生成新对象(消除感知上的关联)

如果要彻底断开与原数据的“关联感”,可以显式生成新的不可变对象(对字符串来说,这一步其实没必要,但能明确避免任何潜在的引用顾虑):

newlist = []
for x in list_1:
    if x["b"] < 40:
        new_dict = {
            "id": str(x["id"]),  # 生成新的字符串对象
            "d": str(x["d"]),
            "c": str(dict_2[x["id"]]["c"])
        }
        newlist.append(new_dict)

3. 处理嵌套可变类型的场景

如果原数据中包含列表、字典这类可变类型,必须使用copy模块的deepcopy来递归复制所有层级的对象,彻底避免引用原数据:

import copy

newlist = []
for x in list_1:
    if x["b"] < 40:
        new_dict = {
            "id": copy.deepcopy(x["id"]),
            "d": copy.deepcopy(x["d"]),
            "c": copy.deepcopy(dict_2[x["id"]]["c"])
        }
        newlist.append(new_dict)

注意:在你的示例场景中,所有值都是不可变的,deepcopy属于过度操作,但如果原数据有嵌套可变结构,这是必要步骤。

4. 彻底清除原数据的引用

生成新列表后,手动清除原数据的所有引用,并触发垃圾回收,确保内存被释放:

# 生成newlist后执行
del list_1
del dict_2

# 手动触发垃圾回收(可选,Python会自动回收,大型数据场景可加速)
import gc
gc.collect()

验证内存释放

再次使用memory_profiler检测:执行del和gc.collect()后,原数据占用的内存应该会被正常回收。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:26:21