42

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

这是一个小代码来说明我想要做什么:

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,另一次使用函数。这似乎不起作用,因为打印继续显示对象。

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

4

4 回答 4

65

tl;博士;

mylist.clear()  # Added in Python 3.3
del mylist[:]

可能是最好的方法来做到这一点。这个答案的其余部分试图解释为什么你的其他一些努力没有奏效。


cpython 至少适用于引用计数以确定何时删除对象。在这里,您对相同的对象有多个引用。 a指的是所c[0]引用的同一对象。当你遍历c( for 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)
于 2013-01-22T18:18:22.080 回答
31

这是从列表中删除每个项目的方法。

del c[:]

下面介绍如何从列表中删除前两项。

del c[:2]

以下是如何从列表中删除单个项目(a在您的情况下),假设c是一个列表。

del c[0]
于 2013-01-22T18:18:35.090 回答
1

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

c = ['a', 'b']
# create and work with a and b    
for i in c:
    del globals()[i]
于 2018-06-20T09:36:26.890 回答
0

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

这是示例:

>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> a = []
>>> a
[]
于 2017-03-23T19:49:56.703 回答