Удалить все объекты в списке

Я создаю много объектов, которые хранятся в списке. Но я хочу удалить их через некоторое время, потому что я создаю новость и не хочу, чтобы моя память была высокой (в моем случае она перескакивает до 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 и другим временем с помощью функции. Это не работает, потому что печать продолжает показывать объекты.

Мне нужно это, потому что я много раз создаю 100 000 объектов. В первый раз, когда я создаю объект 100k, во второй раз еще 100k, но мне не нужно сохранять предыдущие 100k. Если я их не удалю, использование памяти будет очень высоким, очень быстро.

3 ответа

TL;DR;

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)


Здесь вы удаляете каждый элемент из списка.

del c[:]

Здесь вы удаляете первые два элемента из списка.

del c[:2]

Здесь вы удаляете один элемент из списка (a в вашем случае), если c - это список.

del c[0]


Чтобы удалить все объекты из списка, вы можете просто написать list = []

Вот пример:

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

licensed under cc by-sa 3.0 with attribution.