Использование явного del в python для локальных переменных - PullRequest
15 голосов
/ 03 февраля 2010

Каковы лучшие практики и рекомендации по использованию явного оператора del в python? Я понимаю, что он используется для удаления атрибутов или элементов словаря / списка и т. Д., Но иногда я вижу, что он используется для локальных переменных в коде, например так:

def action(x):
    result = None
    something = produce_something(x)
    if something:
        qux = foo(something)
        result = bar(qux, something)
        del qux
    del something
    return result

Есть ли серьезные причины для написания такого кода?

Редактировать: считать qux и something чем-то «простым» без __del__ метода.

Ответы [ 3 ]

34 голосов
/ 03 февраля 2010

Я не помню, когда в последний раз использовал 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 контейнера или назначение элемента или фрагмента даже для , что ! -).

4 голосов
/ 03 февраля 2010

номер

Я уверен, что кто-то придумает какую-нибудь глупую причину сделать это, например, чтобы убедиться, что кто-то случайно не использует переменную после того, как она больше не действительна. Но, вероятно, тот, кто написал этот код, был просто сбит с толку. Вы можете удалить их.

2 голосов
/ 12 сентября 2014

Когда вы запускаете программы, обрабатывающие действительно большие объемы данных (по моему опыту, когда общее потребление памяти программой приближается к 1 ГБ), удаляя некоторые объекты: del largeObject1 del largeObject2 ... может дать вашей программе необходимую передышку для работы без исчерпания памяти. Это может быть самым простым способом изменить данную программу в случае ошибки времени выполнения «MemoryError».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...