Python静态变量释放

Python静态变量释放,python,memory-management,static,Python,Memory Management,Static,下面的python静态类变量何时被垃圾回收? 我希望看到来自静态变量foo destructor的消息 class Foo(object): def __init__(self): print "Foo init running" def __del__(self): print "Destructor Foo" class Bar(object): foo = Foo() def __init__(self):

下面的python静态类变量何时被垃圾回收? 我希望看到来自静态变量foo destructor的消息

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 Foo
Destructor Bar

因此,我们希望在删除
Bar
类时删除对
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
我明白了

您可以看到在Python2.7和Python3.4中都调用了析构函数。然而,在Python2.7中,
Bar
在程序关闭期间没有被正确地破坏。正如文件所说:

当解释器退出时,不能保证为仍然存在的对象调用del()方法

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

Python2.7中的类似乎没有因为循环引用而被破坏(见下文)。在Python3.4(在PEP442之后)中,具有循环引用的对象被可靠地破坏(即使它们具有
\uu del\uu
方法),这可以解释这种变化

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

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()
在Python2中,具有循环引用的对象似乎在解释器退出期间不会可靠地被破坏,而在Python3.4中则是如此。我会提供更多的信息

编辑(有关循环引用的更多详细信息):

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

MyClass.__dict__['__dict__'].__objclass__ == MyClass
其次,通过他们的MRO详细信息:

MyClass in MyClass.__mro__

对我来说不是重复的。另一个问题是关于
循环引用
。什么是“Python静态变量”?这个概念存在吗?它在Python 3.4中起作用。这并不能解释为什么它没有被删除。这是Python 2.7的一个功能,但我不完全理解设计原理。嗯,我想了很多,并提出了一个合理的解释。你能解释一下循环引用在哪里吗?请详细说明你的最后一段。我不完全明白。@A.P.我不确定——我是从你那里得到的。但我正在调查。当然,所有的类都有到它们的元类的链接,有些元类有到类的链接,但不确定是否所有的元类都有链接?
MyClass in MyClass.__mro__