我创建了许多对象然后我存储在列表中。但是我想在一段时间之后删除它们,因为我创建了一个新闻并且不希望我的记忆变高(在我的情况下,如果我不删除它,它会跳到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。如果我不删除它们,内存使用率非常高,非常快。
答案 0 :(得分:43)
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, ...]
最后,更新的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)
如果目标是删除对象a
和b
本身(似乎是这种情况),则形成列表[a, b]
并没有帮助。相反,应该保留一串用作这些对象名称的字符串。这些允许通过访问globals()
字典来循环删除对象。
c = ['a', 'b']
# create and work with a and b
for i in c:
del globals()[i]