在 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__
方法的“简单”的东西。
最佳答案
我不记得我上次使用 del
是什么时候了——确实很少用到它,而且通常仅限于在需要 import< 之后清理模块的命名空间之类的任务
之类的。
特别是,它不是真实的,正如另一个(现已删除的)答案所声称的那样,
Using
del
is the only way to make sure a object's__del__
method is called
理解这一点非常重要。为了提供帮助,让我们用 __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
的方式,例如本例中的切片分配,或名称和其他插槽的其他重新绑定(bind)),then __del__
被调用——无论 del
是否曾参与减少对象的引用,绝对没有区别不管怎样。
所以,除非您出于某种特定原因特别需要清理命名空间(通常是模块的命名空间,但可以想象是类或实例的命名空间),否则不要打扰 del
(它可以偶尔可以方便地从容器中删除项目,但我发现我经常使用容器的 pop
方法或项目或切片分配,即使是 that!- )。
关于python - 在局部变量上使用python中的显式del,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2192926/