Skip to main content
 首页 » 编程设计

python内存回收关于dict和list

2025年05月04日17jpfss

最近,我对python的内存管理感到困惑。首先是关于字典,说我有 一个复合字典对象,如

d = {id1: {'x': 'a', 'y': [1,2,3], 'z': {'k', 'v'}}, id2: {...}} 

如果我调用del,

del d[id1] 

d[id1]['y'] 和 d[id1]['z'] 会一起回收吗?

其次是list,我看了here的答案,所以我试了一下。这是我的代码

import sys 
import gc 
import time 
from collections import defaultdict  
from pprint import pprint  
 
def f(): 
    d = defaultdict(int)  
    objects = gc.get_objects()  
    for o in objects:  
        d[type(o)] += 1 
    x = d.items() 
    x = sorted(x, key=lambda i: i[1], reverse=True) 
    pprint(x[:5])  
 
def loop(): 
    while True: 
        leaked = [[x] for x in range(100)] 
        f() 
        time.sleep(0.1) 

当范围是 100 时,函数 f 确实向我展示了列表在增加,但是当 我将范围修改为1000,没有任何改变,列表的数量保持不变。 谁能告诉我这是什么问题?

请您参考如下方法:

del 删除对当前命名空间中对象的引用。 在 Cpython 中,当一个对象的引用计数达到 0 时,它将可供 python 用于 future 的对象(它不一定返回给操作系统)。

考虑:

a = [] 
b = a 
del a #The list doesn't get freed because `b` is still a reference to that list 

在您的场景中,当您del d[id1] 时,您删除了对该(内部)字典的引用。因为它持有一堆对其他对象的引用,所以这些对象中的每一个现在都少了一个引用。如果它们的引用计数达到 0,它们将被收集,并且它们持有引用的每个对象都将减少其引用计数,依此类推。