2011-03-13 4 views
1

개체를 삭제할 때 개체가 삭제 된 것을 완전히 확인할 수있는 방법이 있습니까? 예를 들어파이썬에서 전체 개체 삭제

, 당신은 같은 한 경우 :

A = NewObject() 
B = NewObject() 
C = NewObject() 

List1 = [A,B,C] 
List2 = [1,2,3,C] 

del A 
del List2[3] 

을 그들이 어디에 있든 객체가 List1는 B를 포함하는 것이며, 그 List2는 1,2,3를 포함하는 것을 의미 삭제했다.

이와 비슷한 동작이 수행 될 수있는 방법이 있습니까?

+0

나는 문제의 답을 얻은 모든 질문에 대한 대답을 모두 수락했다. – Hugoagogo

답변

4

어떤 경우에는 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이 후보가 될 수 있습니다.

+0

이것은 올바른 방향으로 가고 있지만 보이지 않는 것처럼 보입니다. 즉, http://pastebin.com/BsximMga는 다음과 같은 확신이 있습니다. 가비지 컬렉터가 실행될 때 – Hugoagogo

+0

@ 휴고, 내 편집 참조. 당신은 실제로 당신이 만료시키고 자하는 것을 둘러싼 weakref wrapper를 생성 할 필요가있다. –

+0

감사합니다. 좋은 설명입니다. – Hugoagogo

2

아니요, 실제 대상이 아닌 deleting a name입니다. 하나의 이름 만 지울 때 개체가 파괴 될 수있는 이유나 메커니즘이 없습니다 (다른 이름도 삭제됨).

+0

나는 그것이 기능을 달성 할 수있는 방법이 있는지 물어 보는 이유는 단지 이름을 삭제한다는 것을 알고 있었다. – Hugoagogo

1

이렇게하지 마십시오. 어쨌든 작동하지 않습니다. 객체가 더 이상 필요하지 않을 때 자동으로 삭제되는 방식으로 프로그램을 구조화하십시오.

개체가 사용하는 외부 리소스를 해제하고 싶을 수도 있습니다. 객체 삭제를 사용하지 마십시오 (__del__은 디 구성자가 아닙니다!) - 컨텍스트 관리자 프로토콜 (일명 with 문)을 대신 사용하십시오. 나는 이것을 시도하는 다른 어떤 이유에 대해서 정말로 생각할 수 없다 ...

+0

나는 이유가있다. 이 일을하려고 그 프로그램에서 나는 전반적인 관리자 클래스, 노드 클래스 및 링크 클래스로 구성되어있는 노드 시스템을 가지고, 나는 링크를 삭제하려고하는 경우 여전히 그것에 대한 참조를 남길 것입니다 문제가 있습니다 관리자 및 포인트 객체와 같은 장소에서 – Hugoagogo

관련 문제