In Python werden Müllobjekte durch Referenzzählung recycelt. In einigen zirkulären Datenstrukturen (Bäume, Diagramme ...) gibt es zirkuläre Referenzen zwischen Objekten. Beispielsweise verweist der übergeordnete Knoten des Baums auf den untergeordneten Knoten. und der untergeordnete Knoten verweist auch auf den übergeordneten Knoten. Durch Löschen des Verweises auf den übergeordneten und untergeordneten Knoten können die beiden Objekte zu diesem Zeitpunkt nicht sofort freigegeben werden.
Anforderungen:
Wie löst man ein solches Speicherverwaltungsproblem?
Wie frage ich den Referenzzähler eines Objekts ab?
Import SysSys.getrefcount (obj)
# Wie löst man Speicherverwaltungsprobleme?
#!/usr/bin/python3 import weakref import sys class Data(object): def __init__(self, value, owner): self.value = value # 声明弱引用,owner为Node类本身 self.owner = weakref.ref(owner) # 通过函数调用的方式访问引用对象 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): # 把类本身,也当做参数传入Data类中 self.data = Data(value, self) # 自定义对象名,容易辨认 def __str__(self): return 'Node' def __del__(self): print('in_node.__del__') if __name__ == '__main__': node = Node(100) print(node.data) # 打印node对象的引用计数 print(sys.getrefcount(node) - 1) # 当删除node对象时候,Data实例对象在引用计算为0也相应释放 del node input('del done >>>>>')
Das obige ist der detaillierte Inhalt vonWie Python den Speicher in Zirkelverweisen verwaltet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!