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

Использование явного del в python для локальных переменных

Каковы наилучшие практики и рекомендации по использованию явного выражения 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__.

4b9b3361

Ответ 1

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

В частности, он не true, как утверждал другой (теперь удаленный) ответ, что

Использование 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, например, назначение среза, как в этом случае, или другие перезаписи имен и других слотов), , затем __del__ вызывается - независимо от того, когда del когда-либо участвовал в сокращении ссылок на объекты, или нет, не имеет абсолютно никакой разницы.

Итак, если вам специально не нужно очищать пространство имен (как правило, пространство имен модулей, но, предположительно, класс или экземпляр) по какой-то определенной причине, не беспокойтесь с помощью del (иногда это может быть полезно для удаления элемент из контейнера, но я обнаружил, что я часто использую метод контейнера pop или элемент или назначение среза даже для этого! -).

Ответ 2

Нет.

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

Ответ 3

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

Ответ 4

На самом деле, я только что натолкнулся на использование для этого. Если вы используете locals(), чтобы вернуть словарь локальных переменных (полезно при разборе чего-либо), тогда del будет полезен, чтобы избавиться от временного, который вы не хотите возвращать.