del與垃圾回收、弱引用
阿新 • • 發佈:2022-03-13
目錄
del命令與垃圾回收
- del命令只會刪除物件的引用,但是不會刪除物件。但是刪除引用有可能導致物件被刪除。
- python物件被刪除有兩種情況:
- 某個物件的引用計數為零
- 一組物件之間全是相互引用,導致組中物件不可取
- 兩種情況可以歸為一種,如果某個物件不可獲取了,那麼將會被當作垃圾回收。
- 儘量不要自己實現特殊方法__del__
弱引用
- 弱引用不會增加物件的引用計數數量。
- 弱引用的目標物件稱為所指物件。
- 弱引用不會妨礙所指物件被當作垃圾回收。
- 弱引用是可呼叫的物件,其返回值是被引用的物件。若被指物件不存在了,則返回None。
弱引用例子
- 使用弱引用需要首先匯入weakref包
- 有一點需要注意,如果控制檯輸出的結果不為None,則python會自動把 _ 變數名繫結到結果不為None的那個結果上,因此可能會隱式地增加了新的引用。
- 建立一個弱引用
- 因為弱引用是可呼叫物件,其返回結果正是所指物件
- 將變數a_set不再引用集合{0, 1},引用計數減一
- 此時呼叫弱引用仍能返回集合{0, 1},這個因為集合{0, 1}還沒有被回收,繫結其上的還有一個變數,即 _ 。且這一行執行完,_ 仍繫結在集合{0, 1}上。
- 此時弱引用返回結果當然不是None,但是由於控制檯輸出了False,因此變數 _ 被繫結到了False上,集合{0,1}的引用技術歸零,被垃圾回收。
- 此時集合{0,1}已經被回收,因此呼叫弱引用返回None。
weakref集合
- weakref.ref類是低階介面,儘量不要直接使用。應儘量使用weakref集合類。
- weakref集合類包括 WeakKeyDictionary、WeakValueDictionary、WeakSet、finalize。
弱引用的侷限
- 不是每個python物件都可以作為弱引用的所指物件。
- list和dict示例不能作為所指物件,但它們的子類可以。
- set可以作為所指物件。
- 自定義型別可以作為所指物件。
- int和tuple不能作為所指物件,其子類也不行。