我编写了以下代码来检查python如何释放它的对象内存,嗯,我发现了一些有趣的东西,但我不确定,所以我将其发布在这里寻求帮助。
第一
class A():
def __del__(self):
print "A __del__"
class B():
def __del__(self):
print "B __del__"
if __name__ == "__main__":
a = A()
b = B()
print "main leaving"
输出是:
main leaving
A __del__
B __del__
看起来当物体离开它的区域时,它会调用del函数来释放它的资源,先main离开,然后Adel,最后B。
I thought may be A & B's __del__ function call's sequence is influenced by the object declare sequence, so I write it like this:
class A():
def __del__(self):
print "A __del__"
class B():
def __del__(self):
print "B __del__"
if __name__ == "__main__":
b = B() ### declare b first
a = A()
print "main leaving"
嗯,输出是一样的。
然后我将代码重写为这样
class B():
def __del__(self):
print "B __del__"
class A():
def __del__(self):
print "A __del__"
if __name__ == "__main__":
a = A()
b = B()
print "main leaving"
但是,结果是一样的。
所以,看来python解释器已经得到了它拥有的所有对象的字典,当对象离开它的区域时,它会通过字典序列释放它的资源,这可能与alpha序列相同,是这是真的吗?
最佳答案
看起来 GC 按字母顺序删除变量。
class A(object):
def __init__(self, val):
self.val = val
def __del__(self):
print self.val
if __name__ == '__main__':
b = A(2)
a = A(1)
c = A(3)
d = A(4)
print 'Bye!'
Bye!
1
3
2
4
但这并不总是有效。
class A(object):
def __init__(self, val):
self.val = val
def __del__(self):
print self.val
if __name__ == '__main__':
b = A(2)
a = A(1)
d = A(4)
c = A(3)
print 'Bye!'
Bye!
1
3
2
4
关于python - 关于 python 如何进行 GC 的一些有趣的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17217294/