代码之家  ›  专栏  ›  技术社区  ›  abbot

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

  •  15
  • abbot  · 技术社区  · 15 年前

    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__

    3 回复  |  直到 15 年前
        1
  •  36
  •   Alex Martelli    15 年前

    我不记得我上次用的是什么时候了 del --对它的需求确实很少,而且通常仅限于在需要时清理模块名称空间之类的任务 import 等等。

    特别是 诚然,正如另一个(现已删除)答案所声称的那样

    使用 只有这样才能确保 __del__ 方法被调用

    __德尔__ 并在调用时检查:

    >>> class visdel(object):
    ...   def __del__(self): print 'del', id(self)
    ... 
    >>> d = visdel()
    >>> a = list()
    >>> a.append(d)
    >>> del d
    >>>
    

    看见 德尔 难道不“确保”吗 __德尔__ 被调用: 德尔 最后的 参考原因 __德尔__ 被称为。因此,也:

    >>> a.append(visdel())
    >>> a[:]=[1, 2, 3]
    del 550864
    del 551184
    

    当最后一次引用确实消失时(包括以不涉及 德尔 ,如本例中的片分配,或名称和其他插槽的其他重新绑定), 然后 __德尔__ 德尔 是否曾参与减少对象的引用,使 没什么区别。

    因此,除非您出于某种特定的原因特别需要清理名称空间(通常是模块的名称空间,但可以想象是类或实例的名称空间),否则不必担心 (从容器中取出物品有时会很方便,但我发现我经常使用容器的 pop 那个

        2
  •  4
  •   Jason Orendorff Oliver    15 年前

    号码

    我相信有人会想出一些愚蠢的理由来这样做,例如,确保某人不会在变量不再有效后意外使用该变量。但可能编写这段代码的人只是感到困惑。您可以删除它们。

        3
  •  2
  •   user4034077    10 年前

    del largeObject1 del largeObject2 可以为您的程序提供必要的喘息空间,使其在不耗尽内存的情况下运行。这是修改给定程序的最简单方法,以防出现MemoryError运行时错误。

        4
  •  0
  •   user3054603    5 年前

    事实上,我刚刚发现了这个的用途。如果使用locals()返回局部变量的字典(在解析东西时很有用),那么del对于消除不想返回的临时变量很有用。