2013-06-20 57 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