1. 程式人生 > 其它 >del與垃圾回收、弱引用

del與垃圾回收、弱引用

目錄

del命令與垃圾回收

  • del命令只會刪除物件的引用,但是不會刪除物件。但是刪除引用有可能導致物件被刪除。
  • python物件被刪除有兩種情況:
    • 某個物件的引用計數為零
    • 一組物件之間全是相互引用,導致組中物件不可取
    • 兩種情況可以歸為一種,如果某個物件不可獲取了,那麼將會被當作垃圾回收。
  • 儘量不要自己實現特殊方法__del__

弱引用

  • 弱引用不會增加物件的引用計數數量。
  • 弱引用的目標物件稱為所指物件。
  • 弱引用不會妨礙所指物件被當作垃圾回收。
  • 弱引用是可呼叫的物件,其返回值是被引用的物件。若被指物件不存在了,則返回None。

弱引用例子

  • 使用弱引用需要首先匯入weakref包
  • 有一點需要注意,如果控制檯輸出的結果不為None,則python會自動把 _ 變數名繫結到結果不為None的那個結果上,因此可能會隱式地增加了新的引用。

  1. 建立一個弱引用
  2. 因為弱引用是可呼叫物件,其返回結果正是所指物件
  3. 將變數a_set不再引用集合{0, 1},引用計數減一
  4. 此時呼叫弱引用仍能返回集合{0, 1},這個因為集合{0, 1}還沒有被回收,繫結其上的還有一個變數,即 _ 。且這一行執行完,_ 仍繫結在集合{0, 1}上。
  5. 此時弱引用返回結果當然不是None,但是由於控制檯輸出了False,因此變數 _ 被繫結到了False上,集合{0,1}的引用技術歸零,被垃圾回收。
  6. 此時集合{0,1}已經被回收,因此呼叫弱引用返回None。

weakref集合

  • weakref.ref類是低階介面,儘量不要直接使用。應儘量使用weakref集合類。
  • weakref集合類包括 WeakKeyDictionary、WeakValueDictionary、WeakSet、finalize。

弱引用的侷限

  • 不是每個python物件都可以作為弱引用的所指物件。
  • list和dict示例不能作為所指物件,但它們的子類可以。
  • set可以作為所指物件。
  • 自定義型別可以作為所指物件。
  • int和tuple不能作為所指物件,其子類也不行。