我创建了许多对象,然后将它们存储在列表中。但是我想在一段时间后删除它们,因为我创建了一个新闻,并且不希望我的内存过高(就我而言,如果不删除它,它会跳到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。如果我不删除它们,则内存使用率会非常高而且很快。
tl; dr;
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)
问题内容: 我试图从两个文件中读取并将它们存储在两个单独的arraylist中。文件由单词组成,这些单词要么单独一行,要么多个单词之间用逗号分隔。我用以下代码读取每个文件(不完整): 我现在需要读入两个文件,并从第一个文件中删除所有单词,该单词也存在于第二个文件中(文件中有一些重复的单词)。我已经尝试过for- loops和其他类似的东西,但是没有任何效果,因此将不胜感激! 额外的问题:我还需要找
问题内容: 如果我需要从List中删除一个对象(假设字符串“ abc” linkedList或ArrayList),则可以删除哪一个?(我认为两者都是相同的) ,如果我使用Linkedlist和arraylist,那么时间和空间的复杂度是多少 (我相信两者的时间复杂度都为O(n)相同) 问题答案: 两者都具有相同的时间复杂度-O(n),但是恕我直言,该版本会更快,尤其是在大型列表中,因为当您从数组
问题内容: 如何使用JDBC删除Apache Derby DB上架构中的所有表? 问题答案: 有关执行此操作的实际代码,请检查Derby发行版的Derby测试套件部分中的CleanDatabaseTestSetup.java。
问题内容: 我将如何使用python检查列表并删除所有重复项?我不需要指定重复项是什么- 我希望代码找出是否存在重复项,如果有则将其删除,每个重复项仅保留一个实例。如果列表中有多个重复项,它也必须起作用。 例如,在下面的代码中,列表lseparatedOrbList有12个项目-一项被重复六次,一项被重复五次,并且只有一个实例。我希望它更改列表,因此只有三项-每一项,并且它们之前出现的顺序相同。我
问题内容: 我想从数组中的每个对象中删除该属性。有没有比使用循环并从每个对象中删除它更好的方法了? 似乎应该有一种使用方式,或其他方式。我不知道。有想法吗? 问题答案: 唯一的其他方法是修饰,实际上是循环。 例如 : 笔记: 如果要与IE8兼容,则需要forEach的垫片。正如您提到prototype一样,prototype.js也有一个shim。 是最糟糕的“优化杀手”之一。使用它经常会破坏应用
我想从数组中的每个对象中删除属性。有没有比使用循环并从每个对象中删除它更好的方法? 似乎应该有一种方法来使用或其他东西。我不知道。想法?