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

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)

编写这样的代码有什么严重的原因吗?

编辑:考虑quxsomething在没有__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方法或者甚至是项目或切片分配 - !).

  • 亚历克斯,很快Python的技术作家就会没有工作; )感谢另一个很好的答案. (3认同)
  • @Dana,当然不要,因为我本人就是这样的作家;-)。@jhwist,谢谢! (2认同)
  • 可以预期,当解释器退出时,所有的`__del__`都会被调用 - 事实并非如此.通过自己删除refs你可以确保调用所有`__del__`,但`with`是一个更好的方法. (2认同)