어떤 경우에는 weak references을 사용할 수있다. C
이 활성 상태로 유지되는지 신경 쓰지 않는다면 weakref로 래핑하고 C
에 대한 참조가 List1에서 만료되면 가비지 수집기가 연관된 모든 메모리를 수집합니다.
파이썬은 객체를 수집해야하는지 여부를 결정하기 위해 참조 카운팅을 사용하므로 참조가 어딘가에 보관되는 한 해당 객체를 완전히 삭제할 수 없습니다. 그러나 약한 참조가 객체를 감싸는 경우 그 참조는 계산되지 않습니다. 따라서 카운트가 0으로 떨어지면 GC의 편리성에 따라 수집됩니다.
약한와 관련된 몇 가지주의 사항이 있으므로 문서를 완전히 읽으십시오. 특히 weakref 내에서 사용될 수있는 객체의 유형.
편집 :
예 -
>>> class List(list):
... pass
...
>>> weaklist = List()
>>> weaklist.append('a')
>>> weaklist.append('b')
>>> stronglist = [ ['c','d','e'] ]
>>> weaklist
['a', 'b']
>>> stronglist
[['c', 'd', 'e']]
>>> import weakref
>>> stronglist.append(weakref.ref(weaklist))
>>> stronglist
[['c', 'd', 'e'], <weakref at 0x10046e578; to 'List' at 0x100455f70>]
>>> stronglist[1]()
['a', 'b']
>>> del weaklist
>>> stronglist
[['c', 'd', 'e'], <weakref at 0x10046e578; dead>]
>>> stronglist[1]()
>>>
내가보기 엔 weakrefs에 전체 문서를 읽고 조언한다. 노드 구조를 구축하려고하지만 Manager에서 노드 구조를 참조 할 수있는 것처럼 들립니다. 노드를 일반 객체로 만들지 만 Manager 내의 해당 객체에 약한 참조를 배치합니다. 그런 식으로 노드가 제거되면 Manager 내의 참조가 단순히 사라집니다.
weakref 모듈 내에 정의 된 WeakValueDictionary
이 후보가 될 수 있습니다.
나는 문제의 답을 얻은 모든 질문에 대한 대답을 모두 수락했다. – Hugoagogo