关于字典和列表的python内存回收

1 python memory

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

d = {id1: {'x': 'a', 'y': [1,2,3], 'z': {'k', 'v'}}, id2: {...}}
Run Code Online (Sandbox Code Playgroud)

如果我打电话给del,

del d[id1]
Run Code Online (Sandbox Code Playgroud)

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

第二是关于列表,我从这里读了答案,所以我尝试了.这是我的代码

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)
Run Code Online (Sandbox Code Playgroud)

当范围是100时,好吧,函数f确实显示我的列表正在增加,但是当我将范围修改为1000时,没有什么可以改变,列表的数量保持不变.谁能告诉我这是什么问题?

mgi*_*son 5

del删除对当前名称空间中对象的引用. 在Cpython中,当一个对象的引用计数达到0时,它将可供python用于将来的对象(它不一定返回到OS).

考虑:

a = []
b = a
del a #The list doesn't get freed because `b` is still a reference to that list
Run Code Online (Sandbox Code Playgroud)

在您的方案中,当您del d[id1]删除对该(内部)字典的引用时.由于它持有一堆对其他对象的引用,因此每个对象现在少了1个引用.如果它们的引用计数达到0,它们将被收集,并且它们持有引用的每个对象将减少其引用计数,依此类推.