순환 참조가 관련되어있을 때 사용자 지정 __del__
메서드가 실행되지 않는 것처럼 보입니다. 이런 일이 발생하는 이유순환 참조를 포함 할 때 __del__method가 실행되지 않음
class DelClass():
def __init__(self,a):
self.prop = a
def __del__(self):
print 'del'
if __name__ == "__main__":
dc1 = DelClass(None)
dc2 = DelClass(dc1)#dc2 referring to dc1
dc1.prop = dc2#dc1 referring to dc2, thus creating circular reference
del dc1#not executing the custom __del__ method
dc = DelClass(1)
del dc#executing the custom __del__ method
: 여기
은 샘플 코드?편집 : BrenBarn에게 감사드립니다. 이유를 찾았습니다.
import gc
class DelClass():
def __init__(self,name,a):
self.name = name
self.prop = a
def __del__(self):
print '#####deleting',self.name
dc1 = DelClass("dc1",None)
dc2 = DelClass("dc2",dc1)#dc2 referring to dc1
dc1.prop = dc2#dc1 referring to dc2, thus creating circular reference
print "before deleting dc1,reference count:",len(gc.get_referrers(dc1))
del dc1#not executing the custom __del__ method
print "after deleting dc1, reference count:",len(gc.get_referrers(dc2.prop))
print "deleting the reference held by dc2"
del dc2.prop
print dc2
출력은 :
del something
은 레퍼런스 카운트가 테스트 코드 여기서 0
도달 할 때
__del__
만 실행할 1만큼 something
의 참조 카운트를 감소 :
before deleting dc1,reference count: 2
after deleting dc1, reference count: 1
deleting the reference held by dc2
#####deleting dc1
<__main__.DelClass instance at 0x9316dec>
#####deleting dc2
또 다른 질문이 나타납니다 :
왜 출력의 마지막 줄 (#####deleting dc2
)이 발생합니까?
일부 암시적인 del
작업이 발생합니까?