gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:09:50 25 4
gpt4 key购买 nike

当 Python 解释器关闭时,我对对象发生了什么感到有点困惑。如果我写一点这样的代码

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

o = MyClass()

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

I'm going away

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

我的困惑是因为:

  1. 我找不到任何说明 python 将在退出时清除所有引用的文档。
  2. 我很困惑为什么它在内存即将返回给操作系统并声明空闲时清理对象。我想在复杂的系统中,删除内存中无论如何都将被释放的对象的成本很高。
  3. 阅读有关 __del__() 的文档我看到了这个 不能保证在解释器退出时仍然存在的对象调用 __del__() 方法。 它正在变得有点复杂,他们是说由于某些周期依赖性而不能保证运行,还是不能保证?谁来决定?

所以我的问题是:

  1. 谁在我上面的例子中调用了 __del__
  2. 为什么当我没有引用循环时保证被调用

最佳答案

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

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

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

关于python - 解释器关闭时对象会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26456615/

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