在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__
视为“简单”。
答案 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有助于摆脱您不想返回的临时变量。