解释器关闭时对象会发生什么

时间:2014-10-19 23:38:42

标签: python

当Python解释器关闭时,对于对象发生的事情我有点困惑。 如果我写一些像这样的代码

class MyClass(object):
    def __del__(self):
        print "I'm going away"

o = MyClass()

然后运行它,我会得到这个

I'm going away

我的理解是,当解释器关闭时,它将删除对创建对象的所有引用,如果指定,这些对象将运行__del__()(因为它们的引用计数为0)。

我的困惑是因为:

  1. 我无法找到任何文档说python将在退出时清除所有引用。
  2. 我很困惑为什么当内存即将返回到操作系统并且无论如何都声明 free 时它正在清理对象。我想在复杂的系统中,删除内存中即使是免费的对象的成本很高。
  3. 阅读有关__del__()的文档我看到了It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits.而且它变得有点复杂了,他们是说由于某些周期依赖性而无法保证它不能保证运行吗?是谁决定的?
  4. 所以我的问题是:

    1. 在上面的示例中调用了__del__
    2. 当我没有参考周期时,为什么没有guaranteed被调用

1 个答案:

答案 0 :(得分:2)

我没有看到第一个问题的意义,但对于CPython 2.7.8,__del__PyInstanceObject.instance_dealloc调用,tp_dealloc被注册为Py_DECREF,被称为当调用__del__并且引用计数达到零时。所以,我们只是说解释器调用它,而不是Python代码。如果你问这个问题,希望你可以改变调用的方式和时间,我认为这是不可能的。

至于为什么不能保证,要做到这一点,你必须在退出之前通过所有模块删除它们的变量,但如果__del__方法依赖于任何全局变量,那么没有简单的方法来保证他们被执行的安全命令。我不是说这是不可能的,就像参考周期一样,我说它很复杂。

我想这在某个时候已经讨论过了,但社区或BDFL决定不值得麻烦。我相信我在几年前看到了一些讨论,但我现在找不到它。首先从不鼓励使用{{1}}方法,如果需要保证调用一些析构函数方法,那么最好使用上下文管理器。