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

2024-04-27 05:01:29 发布

您现在位置:Python中文网/ 问答频道 /正文

当Python解释器关闭时,我有点搞不清楚对象发生了什么。 如果我写一点这样的代码

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

o = MyClass()

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

I'm going away

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

我的困惑是因为:

  1. 我找不到任何说明python将在退出时清除所有引用的文档。你知道吗
  2. 我不明白为什么它会在内存即将返回操作系统并声明空闲时清理对象。我猜在复杂的系统中,删除内存中即将免费的对象会有很大的成本。你知道吗
  3. 阅读关于__del__()的文档,我看到了这个It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits.,它变得有点复杂了,他们是说它不能保证运行是因为一些周期依赖性,还是说它不能保证?谁决定的?你知道吗

所以我的问题是:

  1. 在我上面的例子中谁调用了__del__
  2. 为什么在我没有引用循环的时候不调用guaranteed

Tags: 对象内存代码文档selfthatobjectdef
1条回答
网友
1楼 · 发布于 2024-04-27 05:01:29

我不明白第一个问题的意义,但是对于cpython2.7.8,__del__PyInstanceObject.instance_dealloc调用,它注册为tp_dealloc,当Py_DECREF被调用并且引用计数达到零时调用。所以,让我们假设解释器调用它,而不是Python代码。如果你问这个问题的目的是希望你能改变它的呼叫方式或时间,我认为这是不可能的。你知道吗

至于为什么不能保证,要做到这一点,您必须遍历所有模块,在退出之前删除它们的变量,但是如果__del__方法依赖于任何全局变量,就没有简单的方法来保证它们执行的安全顺序。我不是说这是不可能的,就像参考循环,我是说它很复杂。你知道吗

我想这是在某个时候讨论过的,但社区或BDFL认为这不值得这么麻烦。我相信几年前我看到过一些关于这个的讨论,但现在找不到了。从一开始就不鼓励使用__del__方法,如果您需要保证调用某种析构函数方法,那么最好使用上下文管理器。你知道吗

相关问题 更多 >