2013-06-20 23 views
1

我写了下面的代码来检查python如何释放它的对象内存,以及我发现了一些有趣的东西,但我不确定,所以我在这里发布以寻求帮助。有趣的事情有关python如何做GC

首先

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__ 

看来,当对象离开其区域,它会调用德尔函数释放它的资源,第一主离开,然后A del,last 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解释器已经得到了它所有对象的字典,并且当对象离开它的区域时,它将通过字典序列释放它的资源,这可能与alph序列相同,这是真的?

+0

时,在'Py_DECREF',引用计数变为0,其中留有一定块时引用递减顺序AFAIK CPython的将删除对象是一个实现细节。它完全取决于如何将代码编译为字节码(并且,在删除'dict'的情况下,它可能取决于*可以随机的键的顺序[即,在每次执行时改变,特别是在新版本的python with hash randomization active])。 – Bakuriu

回答

1

看来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