删除对象绝对要保存在字典中,但请保持键

时间:2018-07-11 15:44:37

标签: python python-2.7 dictionary

我想做的很简单,我有一个很大的命令,就像这样:

class a():
    m=0
    def __init__(self, m):
        self.m = m

    def __int__(self):
        return self.m

b=a(4)
c=a(6523)
d=a(741)
e=a(84521111) 

dict={0:b,1:c,2:e,3:d,4:None,5:None,6:None}

for ele in dict.values():
    if ele is not None:
        print int(ele)
    else:
        print "None"

真实的元素有4096个元素。基本上,当我决定杀死对象c时,我会这样做:

dict[1]=None

因为我不想删除键号1,所以它可以正常工作,但是如果该对象仍然在某个地方并且有4096个对象,则该对象在我的小型嵌入式系统上可能是个问题。我可以使用以下方法检查活动对象:

import gc
for obj in gc.get_objects():
    if isinstance(obj, a):
        print obj

输出:

  

<< strong>主要。一个位于0xb749c96c的实例   << strong>主要。实例位于0xb749caac>   << strong>主要。实例位于0xb749c9cc>   << strong>主要。实例位于0xb749cc0c>

那么,如何确定从内存中删除这些对象?

Nota :del dict [1]不起作用,因为它也删除了键,与pop()相同。

我仍在使用Python 2.7 ...

1 个答案:

答案 0 :(得分:2)

在将它们添加到字典中之前,请确保已考虑它们在内存中的事实。

>>> b=a(4)
>>> c=a(6523)
>>> d=a(741)
>>> e=a(84521111) 
>>> 
>>> dict={0:b,1:c,2:e,3:d,4:None,5:None,6:None}
>>> 
>>> for obj in gc.get_objects():
...     if isinstance(obj, a):
...             print obj
... 
<__main__.a instance at 0x7f4078a34dd0>
<__main__.a instance at 0x7f4078a34d88>
<__main__.a instance at 0x7f4078a34d40>
<__main__.a instance at 0x7f4078a34cf8>

现在删除原稿:

>>> del(b)
>>> del(c)
>>> del(d)
>>> del(e)
>>> 
>>> for obj in gc.get_objects():
...     if isinstance(obj, a):
...             print obj
... 
<__main__.a instance at 0x7f4078a34dd0>
<__main__.a instance at 0x7f4078a34d88>
<__main__.a instance at 0x7f4078a34d40>
<__main__.a instance at 0x7f4078a34cf8>

它们仍在内存中,因为它们在字典中。现在从字典中删除它们:

>>> dict[3] = None
>>> dict[2] = None
>>> 
>>> for obj in gc.get_objects():
...     if isinstance(obj, a):
...             print obj
... 
<__main__.a instance at 0x7f4078a34dd0>
<__main__.a instance at 0x7f4078a34d88>
>>> 

我们刚刚删除了2个对象。