我有以下代码在其中重新分配了几个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
项目。它是否正确?为什么或为什么不呢?
答案 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
的原始绑定