Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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)

Ответ 2

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

del c[:]

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

del c[:2]

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

del c[0]

Ответ 3

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

Вот пример:

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