当前位置: 首页 > 面试题库 >

删除列表中的所有对象

蒯宇定
2023-03-14
问题内容

我创建了许多对象,然后将它们存储在列表中。但是我想在一段时间后删除它们,因为我创建了一个新闻,并且不希望我的内存过高(就我而言,如果不删除它,它会跳到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]。当您在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, ...]

最后,最近的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。 是最糟糕的“优化杀手”之一。使用它经常会破坏应用

  • 我想从数组中的每个对象中删除属性。有没有比使用循环并从每个对象中删除它更好的方法? 似乎应该有一种方法来使用或其他东西。我不知道。想法?