在python中对局部变量使用显式del

时间:2010-02-03 15:12:15

标签: python coding-style

在python中使用显式del语句的最佳做法和建议是什么?我知道它用于删除属性或字典/列表元素等等,但有时我看到它用在像这样的代码中的局部变量:

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__视为“简单”。

4 个答案:

答案 0 :(得分:34)

我不记得上次使用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删除了一个引用,只删除最后引用导致__del__ } 被称为。所以,还有:

>>> a.append(visdel())
>>> a[:]=[1, 2, 3]
del 550864
del 551184

当最后一个引用消失时(包括不涉及del的方式,例如本例中的切片赋值,或其他名称和其他槽的重新绑定),然后< / strong> __del__被调用 - 无论del是否曾参与减少对象的引用,是否使绝对没有任何区别。

因此,除非您特别需要清理命名空间(通常是模块的命名空间,但可以想象是某个类或实例的命名空间),因此请不要理会del(它偶尔会很方便从容器中删除项目,但我发现我经常使用容器的pop方法或项目或切片分配,即使对于那个! - )。

答案 1 :(得分:4)

没有

我确信有人会想出一些愚蠢的理由来做这件事,例如:确保有人在不再有效之后不会意外使用该变量。但是,编写此代码的人可能只是感到困惑。你可以删除它们。

答案 2 :(得分:2)

当您运行程序处理大量数据时(根据我的经验,当程序的总内存消耗接近1GB时)删除一些对象:     del largeObject1     del largeObject2     ... 可以为您的程序提供必要的喘息空间,而不会耗尽内存。在“MemoryError”运行时错误的情况下,这可能是修改给定程序的最简单方法。

答案 3 :(得分:0)

实际上,我只是遇到了一个用途。如果您使用locals()返回一个局部变量字典(在解析事物时很有用),则del有助于摆脱您不想返回的临时变量。