gpt4 book ai didi

Python 静态变量释放

转载 作者:太空狗 更新时间:2023-10-30 00:10:20 24 4
gpt4 key购买 nike

下面的 python 静态类变量什么时候被垃圾回收?我期待看到来自静态变量 foo 析构函数的消息。

class Foo(object):
def __init__(self):
print "Foo init running"

def __del__(self):
print "Destructor Foo"

class Bar(object):
foo = Foo()
def __init__(self):
print "Bar init running"

def __del__(self):
print "Destructor Bar"

bar_obj = Bar()

输出是(Python 2.7):

Foo init running
Bar init running
Destructor Bar

我期待:

Foo init running
Bar init running
Destructor Foo
Destructor Bar

最佳答案

因此我们希望在删除 Bar class 时删除对 foo 对象的引用。这通常就是发生的事情。如果你尝试

class Foo(object):
def __init__(self):
print("Foo init running")

def __del__(self):
print("Destructor Foo")

class Bar(object):
foo = Foo()
def __init__(self):
print("Bar init running")

def __del__(self):
print("Destructor Bar")


def f():
bar_obj = Bar()

f()
del Bar

我明白了

Foo init running
Bar init running
Destructor Bar
Destructor Foo

您可以看到在 Python 2.7 和 Python 3.4 中都调用了两个析构函数。但是,在 Python 2.7 中,Bar 在程序关闭期间未被正确销毁。正如文档所说:

It is not guaranteed that del() methods are called for objects that still exist when the interpreter exits.

为什么 Bar 在解释器退出时没有被破坏?

由于循环引用(见下文),Python 2.7 中的类似乎没有被破坏。在 Python 3.4 中(在 PEP 442 之后)具有循环引用的对象被可靠地破坏(即使它们具有 __del__ 方法)并且这可以解释变化。

但是,这并不能完全解释差异,因为虽然该类处于引用循环中,但该类本身并没有析构函数。

似乎在 Python 2 中,具有循环引用的对象在解释器退出期间不能可靠地被销毁,而在 Python 3.4 中是这样。我再给一些资料here .

编辑(关于循环引用的更多细节):

类包含对自身的循环引用,首先是通过它们的字典:

MyClass.__dict__['__dict__'].__objclass__ == MyClass

其次通过他们的 MRO 详细信息:

MyClass in MyClass.__mro__

关于Python 静态变量释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33033608/

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