是否需要删除以释放内存

时间:2018-11-18 22:41:13

标签: python python-3.x

我有以下代码在其中重新分配了几个GB的列表:

    res = self.dict_cursor.fetchall()
    res_with_offers = []

    # we add in HDBUY, SDBUY for now -- HARDCODED
    for item in res:
        for avail_code in ['HDBUY', 'SDBUY']:
            _item = deepcopy(item)
            _item['avail_code'] = avail_code
            res_with_offers.append(_item)

    del res; # <== is this line needed?
    res = res_with_offers

我的理解是,del res;作为变量在下面一行的重新分配将删除内存中的初始res项目。它是否正确?为什么或为什么不呢?

1 个答案:

答案 0 :(得分:5)

标识符可以绑定到Python中的对象,也可以不绑定任何东西。就是这样。

如果identifier已绑定到对象,则del identifier会删除绑定,而identifier则不会绑定任何对象。而仅此而已。它对是否释放内存没有直接影响。

删除与对象的最后一个绑定后,该对象就可以进行垃圾回收。在那之前。

在显示的代码中,实际上无法确定最初绑定到res的对象何时有资格进行垃圾回收。就我们所知,例如,

res = self.dict_cursor.fetchall()

fetchall()从内部持久性缓存返回了一个对象。然后

del res

将通过res删除与对象的绑定,但不会对与该对象的任何其他可能的绑定产生影响。在所有绑定消失之前,无法回收该对象。

无论如何,del res在以下位置:

del res
res = anything

没有任何实际目的。 res最终被绑定到anything而不管是否存在del res,因此,无论是否存在res都将删除del res的原始绑定