python - 在局部变量上使用python中的显式del

标签 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

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

编辑:考虑 quxsomething 是没有 __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/

相关文章:

python - 在 python 中使用类

python - 连接python列表中的单个元素

javascript - 一个 JavaScript 函数可以处理不同类型的 HTML 输入类型吗?

javascript - 如果 ie6 做这个其他做那个。我怎样才能做到这一点

php - 试图避免 "spaghetti code",为什么多个 if-else 不好?

Android HoneyComb DatePicker 文本颜色

python - 如何将 Perl Map 函数转换为 Python?

python - int 的实例比其继承类的字节少得多

python - 如何在 python 中将字节作为输入而不进行任何操作?

html - CSS 表格样式 - 试图给更多的空间