abb*_*bot 17 python coding-style
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
Run Code Online (Sandbox Code Playgroud)
编写这样的代码有什么严重的原因吗?
编辑:考虑qux
并something
在没有__del__
方法的情况下成为"简单"的东西.
Ale*_*lli 36
我不记得我上次使用的时间了del
- 确实很少需要它,并且通常仅限于在需要之后清理模块的命名空间等任务import
.
特别是,正如另一个(现已删除的)答案声称的那样,这是不正确的
使用
del
是确保__del__
调用对象方法的唯一方法
理解这一点非常重要.为了帮助,让我们创建一个带有a的类__del__
并检查它何时被调用:
>>> class visdel(object):
... def __del__(self): print 'del', id(self)
...
>>> d = visdel()
>>> a = list()
>>> a.append(d)
>>> del d
>>>
Run Code Online (Sandbox Code Playgroud)
看到? del
没有"确定" __del__
被调用:del
删除一个引用,只删除最后一个引用导致__del__
被调用.所以,还:
>>> a.append(visdel())
>>> a[:]=[1, 2, 3]
del 550864
del 551184
Run Code Online (Sandbox Code Playgroud)
当最后一个引用消失时(包括不涉及的方式del
,例如在这种情况下的切片赋值,或其他名称和其他槽的重新绑定),然后 __del__
被调用 - 是否del
曾参与减少对象的引用或不引用完全没有任何区别.
因此,除非您特别需要清理命名空间(通常是模块的命名空间,但可以想象是某个类或实例的命名空间),因此请不要理会del
(从容器中删除项目偶尔会很方便)但我发现,我经常使用的容器的pop
方法或者甚至是项目或切片分配是 - !).