728x90

객체가 메모리에 유지되거나 유지되지 않도록 만드는것은 참조의 존재여부다.
객체 참조 카운트가 0이면 가비지 컬렉터는 해당 객체를 제거한다.
그러나 불필요하게 객체를 유지시키지 않으면서 객체를 참조할 수 있으면
도움이 되는 경우가 종종 있다. 캐시가 대표적인 경우다.

 

약한 참조는 참조 카운트를 증가시키지 않고 객체를 참조한다.
참조의 대상인 객체를 참조 대상 (referent) 이라고 한다.
따라서 약한 참조는 참조 대상이 가비지 컬렉트 되는것을 방지하지 않는다고 말할 수 있다.

 

약한 참조는 캐시 어플리케이션에서 유용하게 사용된다.
캐시가 참조하고 있다고 해서 캐시된 객체가 계속 남아 있기 원치 않기 때문이다.

 

import weakref

a_set = {0, 1}

wref = weakref.ref(a_set)

print(wref)
print(wref())

a_set = {2, 3, 4}

print(wref())
print(wref() is None)

 

 

  1. 약한 참조 객체 wref를 생성하고 다음행에서 조사한다.
  2. wref()를 호출하면 참조된 객체 {0, 1}을 반환한다 콘솔 세션에서 실행할땐 결과로 나온 {0, 1}이 _변수에 바인딩된다.
  3. a_set이 더이상 {0, 1}집합을 참조하지 않으므로 참조 카운트가 줄어든다. 그렇지만 _변수가 여전히 {0, 1}을 참조한다.
  4. wref()를 호출하면 pycharm에서는 None 콘솔에서는 {0, 1}이 반환된다.
  5. 이제 {0, 1}객체가 제거되었으므로 wref()를 호출하면 None이 반환된다.

 

728x90

'Python > python - pythonic' 카테고리의 다른 글

벡터 클래스의 부활  (0) 2020.12.04
WeakValueDictionary 촌극  (0) 2020.12.04
del 과 가비지 컬렉션  (0) 2020.12.02
간단한 데커레이터 구현하기  (0) 2020.11.28
nonlocal 선언 이 필요한 이유  (0) 2020.11.28