python中通過(guò)引用計(jì)數(shù)來(lái)回收垃圾對(duì)象,在某些環(huán)形數(shù)據(jù)結(jié)構(gòu)(樹(shù),圖……),存在對(duì)象間的循環(huán)引用,比如樹(shù)的父節(jié)點(diǎn)引用子節(jié)點(diǎn),子節(jié)點(diǎn)同時(shí)引用父節(jié)點(diǎn),此時(shí)通過(guò)del掉引用父子節(jié)點(diǎn),兩個(gè)對(duì)象不能被立即釋放
需求:
如何解決此類的內(nèi)存管理問(wèn)題?
如何查詢一個(gè)對(duì)象的引用計(jì)數(shù)?
import sys
sys.getrefcount(obj)
# 查詢引用計(jì)數(shù)必多 1 ,因?yàn)閛bject也引用 查詢對(duì)象
如何解決內(nèi)存管理問(wèn)題?
通過(guò)weakref,進(jìn)行弱引用,當(dāng)del時(shí)候,不再引用,在引用方添加weakref.ref(引用obj); 使用引用的時(shí)候,需要用到函數(shù)調(diào)用的形式#!/usr/bin/python3 import weakrefimport sys class Data(object): def __init__(self, value, owner): self.value = value # 聲明弱引用,owner為Node類本身 self.owner = weakref.ref(owner) # 通過(guò)函數(shù)調(diào)用的方式訪問(wèn)引用對(duì)象 def __str__(self): return "%s's data, value is %s" % (self.owner(), self.value) def __del__(self): print('in_data.__del__') class Node(object): def __init__(self, value): # 把類本身,也當(dāng)做參數(shù)傳入Data類中 self.data = Data(value, self) # 自定義對(duì)象名,容易辨認(rèn) def __str__(self): return 'Node' def __del__(self): print('in_node.__del__') if __name__ == '__main__': node = Node(100) print(node.data) # 打印node對(duì)象的引用計(jì)數(shù) print(sys.getrefcount(node) - 1) # 當(dāng)刪除node對(duì)象時(shí)候,Data實(shí)例對(duì)象在引用計(jì)算為0也相應(yīng)釋放 del node input('del done >>>>>')以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林站長(zhǎng)站。
新聞熱點(diǎn)
疑難解答
圖片精選