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가 납니다.
- 이런 패턴은 “비싼 객체를 캐싱하되, 다른 곳에서 쓰지 않으면 자동으로 비우고 싶을 때” 유용합니다.