Ответ 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)