-->

删除所有对象的列表(Delete all objects in a list)

2019-07-18 12:59发布

我创造了许多对象,然后我存储在列表中。 但我想一段时间后,将其删除,因为我创建一个新闻,不想我的记忆中变高(在我的情况下,跳转到RAM的20场音乐会,如果我不删除)。

这里是一个小代码来说明什么,我试图做的:

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是这两个对象的列表。 我试图用一个for循环使用C绝对删除:一次用DEL和其他时间的函数。 这似乎不是工作,因为打印继续显示的对象。

我需要这个,因为我创造10万级的对象很多次。 我第一次创建100K对象,第二个时间的另一个100K,但我并不需要保留以前的100K。 如果我不删除它们,内存使用情况真的高,速度非常快。

Answer 1:

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, ...]

最后,最近的蟒蛇版本增加了一个clear其做同样的事情,方法del mylist[:]一样。

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


Answer 2:

这里是你如何删除列表中的每一个项目。

del c[:]

这里是你如何删除列表中的前两个项目。

del c[:2]

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

del c[0]


Answer 3:

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

下面是例子:

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


Answer 4:

如果目标是要删除的对象ab本身(这似乎是的情况),形成列表[a, b]是无益的。 相反,人们应该保持作为这些对象的名称的字符串列表。 这些允许一个删除的对象在一个循环中,通过访问globals()字典。

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


文章来源: Delete all objects in a list