Я не помню, когда в последний раз использовал del
- необходимость в этом действительно редка и обычно ограничивается такими задачами, как очистка пространства имен модуля после необходимого import
или тому подобное.
В частности, не верно, поскольку другой (теперь удаленный) ответ утверждал, что
Использование del
- единственный способ убедиться, что объект __del__
метод называется
, и это очень важно понимать.Чтобы помочь, давайте создадим класс с __del__
и проверим, когда он вызывается:
>>> class visdel(object):
... def __del__(self): print 'del', id(self)
...
>>> d = visdel()
>>> a = list()
>>> a.append(d)
>>> del d
>>>
Видите?del
не «удостоверяется», что __del__
вызывается: del
удаляет одну ссылку, и только удаление last ссылки вызывает __del__
.Итак, также:
>>> a.append(visdel())
>>> a[:]=[1, 2, 3]
del 550864
del 551184
, когда последняя ссылка исчезает (в том числе способами, которые не включают del
, такими как назначение фрагмента, как в этом случае, или другие повторные привязки имен и другихslots), , затем вызывается __del__
- независимо от того, был ли del
когда-либо вовлечен в сокращение ссылок на объект или нет, абсолютно не делает никакой разницы.
Таким образом, если вам по какой-то конкретной причине не требуется специально очистить пространство имен (обычно это пространство имен модуля, но, возможно, класса или экземпляра), не беспокойтесь о del
(иногда это может быть удобно для удаления элементаиз контейнера, но я обнаружил, что я часто использую метод pop
контейнера или назначение элемента или фрагмента даже для , что ! -).