16

我已經看過python的官方文檔,但我似乎無法找到什麼是參考週期。任何人都可以澄清它是什麼,因爲我想了解GC模塊。預先感謝您的回覆。python中的引用循環是什麼?

回答

15

引用循環只是指一個或多個引用對象的對象,例如,如果使用代表依賴關係的箭頭將其繪製在紙張上,您將看到一個循環。

的(幾乎)最簡單的參考週期具有兩個對象ab引用對方:

a.other = b 
b.some_attr = a 

樸素的垃圾收集器嚴格工作過的物體是否被另一對象引用。在這種情況下,如果ab都未被別的引用,它們仍然互相引用,並且幼稚的垃圾回收器可能不會回收內存。 (我不知道是否Python可以通過參考週期或困不,雖然)。

編輯:最簡單的參考週期是指本身的對象:

a = [] 
a.append(a) 
10

這是一個參考週期:

l = [] 
l.append(l) 

l第一元件,即l[0],是現在l本身環狀參考。

3
>>> x=[1,2,3] 
>>> x.append(x) 
>>> x 
[1, 2, 3, [...]] 
>>> 

現在這裏變量x是指自身,這被稱爲參考循環。

7
>>> aRef = [] 
>>> aRef.append(aRef) 
>>> print aRef 
[[...]] 

這會創建一個名爲aRef的變量所引用的列表對象。列表對象中的first element是對其自身的引用。在這種情況下,del aRef解除引用aRef到列表對象。但是,列表對象的引用計數不會減少到零,並且列表對象不會被垃圾收集,因爲列表對象仍然引用自身。在這種情況下,Python中的垃圾收集器將定期檢查是否存在這樣的循環引用,並且解釋器將收集它們。以下是手動收集循環引用對象所用空間的示例。

>>> import gc 
>>> gc.collect() 
0 
>>> del aRef 
>>> gc.collect() 
1 
>>> gc.collect() 
0