删除列表中的所有对象

Jea*_*ant 32 python memory object 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)
Run Code Online (Sandbox Code Playgroud)

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

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

mgi*_*son 47

TL;博士;

mylist.clear()  # Added in python3.(? maybe 5?)
del mylist[:]
Run Code Online (Sandbox Code Playgroud)

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


cpython至少用于引用计数以确定何时删除对象.这里有多个对同一对象的引用. a引用引用的相同对象c[0].当你遍历c(for i in c:)时,某些点i也会引用同一个对象.所述del关键字删除单个参考,所以:

for i in c:
   del i
Run Code Online (Sandbox Code Playgroud)

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

以同样的方式:

def kill(self):
    del self
Run Code Online (Sandbox Code Playgroud)

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

mylist = list(range(10000))
mylist[:] = []
print(mylist)
Run Code Online (Sandbox Code Playgroud)

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

del mylist[:]  #This will implicitly call the `__delslice__` or `__delitem__` method.
Run Code Online (Sandbox Code Playgroud)

这将删除所有引用,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, ...]
Run Code Online (Sandbox Code Playgroud)

最后,更新的python修订版增加了一个clear方法,它做了同样的事情del mylist[:].

mylist = [1, 2, 3]
mylist.clear()
print(mylist)
Run Code Online (Sandbox Code Playgroud)

  • soo,如何循环删除A和B? (2认同)
  • @ Jean-FrancoisGallant - 你做不到.不是你的代码设置方式.要在代码中删除`a`和`b`,您需要:`del a; del b; del c [:]` - 那就是说,我怀疑你的测试代码实际上是你正在尝试做什么的好模型...... (2认同)
  • @ Jean-FrancoisGallant - Python实际上从未说明何时将内存返回到操作系统以供重用.它只说明何时将内存返回给python以供重用.因此,确实没有关于内存回到操作系统(AFAIK)的保证.您可能还想尝试[`gc`模块]中的一些函数(http://docs.python.org/2/library/gc.html).在你检查你的内存使用情况之前,我特别想到`gc.collect` ......这可能有所帮助. (2认同)

Jon*_*ric 29

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

del c[:]
Run Code Online (Sandbox Code Playgroud)

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

del c[:2]
Run Code Online (Sandbox Code Playgroud)

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

del c[0]
Run Code Online (Sandbox Code Playgroud)

  • @ThiefMaster:的确,也更快.Python 3.3:`timeit.timeit('del alist [:]','alist = list(range(10000))')`vs.timeit.timeit('alist [:] = []','alist = list (范围(10000))')`分别为0.08622030797414482和0.1133101258892566. (2认同)