gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:16:06 26 4
gpt4 key购买 nike

在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com