Python静态变量释放
下面的python静态类变量何时被垃圾回收? 我希望看到来自静态变量foo destructor的消息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):
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__