我已經看過python的官方文檔,但我似乎無法找到什麼是參考週期。任何人都可以澄清它是什麼,因爲我想了解GC模塊。預先感謝您的回覆。python中的引用循環是什麼?
16
A
回答
15
引用循環只是指一個或多個引用對象的對象,例如,如果使用代表依賴關係的箭頭將其繪製在紙張上,您將看到一個循環。
的(幾乎)最簡單的參考週期具有兩個對象a
和b
引用對方:
a.other = b
b.some_attr = a
樸素的垃圾收集器嚴格工作過的物體是否被另一對象引用。在這種情況下,如果a
和b
都未被別的引用,它們仍然互相引用,並且幼稚的垃圾回收器可能不會回收內存。 (我不知道是否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