删除列表中的所有对象

时间:2013-01-22 18:13:14

标签: python object memory del

我创建了许多对象然后我存储在列表中。但是我想在一段时间之后删除它们,因为我创建了一个新闻并且不希望我的记忆变高(在我的情况下,如果我不删除它,它会跳到20演出的ram)。

这是一个小代码来说明我想要做的事情:

class test:
    def __init__(self):
        self.a = "Hello World"
    def kill(self):
        del self

a = test()
b = test()
c = [a,b]

print("1)Before:",a,b)

for i in c:
    del i

for i in c:
    i.kill()   

print("2)After:",a,b)

A和B是我的对象。 C是这两个对象的列表。我试图在C中使用for循环删除它:一次使用DEL和其他时间使用函数。它似乎不起作用,因为打印继续显示对象。

我需要这个,因为我多次创建了10万个对象。我第一次创建100k对象,第二次创建100k对象但是我不需要保留之前的100k。如果我不删除它们,内存使用率非常高,非常快。

4 个答案:

答案 0 :(得分:43)

TL;博士;

mylist.clear()  # Added in python3.(? maybe 5?)
del mylist[:]

可能是最好的方法。这个答案的其余部分试图解释为什么你的其他一些努力不起作用。


cpython至少适用于引用计数,以确定何时删除对象。这里有多个对同一对象的引用。 a引用c[0]引用的同一对象。当您循环cfor i in c:)时,某些时候i也会引用同一个对象。 del关键字会删除单个引用,因此:

for i in c:
   del i

c中创建对象的引用,然后删除该引用 - 但该对象仍然有其他引用(例如,存储在c中),因此它将保持不变。

以同样的方式:

def kill(self):
    del self

仅删除该方法中对象的引用。从列表中删除所有引用的一种方法是使用切片分配:

mylist = list(range(10000))
mylist[:] = []
print(mylist)

显然,您也可以删除切片以删除对象:

del mylist[:]  #This will implicitly call the `__delslice__` or `__delitem__` method.

这将删除mylist的所有引用,并删除引用mylist的任何引用。与简单地删除列表相比 - 例如

mylist = list(range(10000))
b = mylist
del mylist
#here we didn't get all the references to the objects we created ...
print(b) #[0, 1, 2, 3, 4, ...]

最后,更新的python修订版添加了一个clear方法,它与del mylist[:]做的事情相同。

mylist = [1, 2, 3]
mylist.clear()
print(mylist)

答案 1 :(得分:29)

以下是删除列表中每个项目的方法。

del c[:]

以下是从列表中删除前两项的方法。

del c[:2]

以下是从列表中删除单个项目的方法(在您的案例中为a),假设c是一个列表。

del c[0]

答案 2 :(得分:0)

要删除列表中的所有对象,您可以直接编写list = []

以下是示例:

>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> a = []
>>> a
[]

答案 3 :(得分:0)

如果目标是删除对象ab本身(似乎是这种情况),则形成列表[a, b]并没有帮助。相反,应该保留一串用作这些对象名称的字符串。这些允许通过访问globals()字典来循环删除对象。

c = ['a', 'b']
# create and work with a and b    
for i in c:
    del globals()[i]