https://docs.python.org/3/tutorial/stdlib2.html#weak-references

약한 참조(weak reference) 이해하기

  • Python은 일반 참조가 남아 있는 한 객체를 메모리에서 지우지 않습니다. 캐시처럼 “누군가 쓰고 있을 때만 유지하고 싶고, 그렇지 않으면 자동으로 버려져야 하는” 상황에서는 일반 참조가 방해가 됩니다.
  • weakref 모듈은 객체를 “약하게” 추적합니다. 약한 참조만 존재하면 가비지 컬렉터가 객체를 회수해도 방해하지 않으며, 회수되면 해당 엔트리가 자동으로 제거됩니다.
  • weakref.WeakValueDictionary는 값이 약한 참조로 저장되는 딕셔너리입니다. 객체가 다른 곳에서 더 이상 참조되지 않으면 키-값 쌍도 사라집니다.
import weakref, gc
 
class A:
  def __init__(self, value):
	  self.value = value
  def __repr__(self):
	  return str(self.value)
 
a = A(10)                       # 일반 참조
cache = weakref.WeakValueDictionary()
cache['primary'] = a            # 약한 참조로만 저장 (실제객체 공유)
print(cache['primary'])         # 아직 살아 있으므로 10 출력
 
del a                           # 마지막 강한 참조 제거
gc.collect()                    # 바로 가비지 컬렉션 실행
try:
  print(cache['primary'])     # 객체가 회수되어 KeyError 발생
except KeyError:
  print('자동으로 사라졌습니다.')
  • cache[‘primary’]는 a가 살아 있는 동안만 접근 가능합니다.
  • a를 삭제하고 가비지 컬렉션이 돌면 객체가 회수되고, WeakValueDictionary에서도 자동으로 제거되어 KeyError가 납니다.
  • 이런 패턴은 “비싼 객체를 캐싱하되, 다른 곳에서 쓰지 않으면 자동으로 비우고 싶을 때” 유용합니다.

← python 3.14으로