我创造了许多对象,然后我存储在列表中。 但我想一段时间后,将其删除,因为我创建一个新闻,不想我的记忆中变高(在我的情况下,跳转到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。 如果我不删除它们,内存使用情况真的高,速度非常快。
TL;博士;
mylist.clear() # Added in python3.(? maybe 5?)
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, ...]
最后,最近的蟒蛇版本增加了一个clear
其做同样的事情,方法del mylist[:]
一样。
mylist = [1, 2, 3]
mylist.clear()
print(mylist)
这里是你如何删除列表中的每一个项目。
del c[:]
这里是你如何删除列表中的前两个项目。
del c[:2]
下面是如何从列表中删除单个项目( a
在你的情况下),假设c
是一个列表。
del c[0]
要删除列表中的所有对象,你可以直接写list = []
下面是例子:
>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> a = []
>>> a
[]
如果目标是要删除的对象a
和b
本身(这似乎是的情况),形成列表[a, b]
是无益的。 相反,人们应该保持作为这些对象的名称的字符串列表。 这些允许一个删除的对象在一个循环中,通过访问globals()
字典。
c = ['a', 'b']
# create and work with a and b
for i in c:
del globals()[i]