WeakValueDictionary 촌극
728x90
WeakValueDictionary 클래스는 객체애 대한 약한 참조를 값으로
가지는 가변 매핑을 구현한다.
참조된 객체가 프로그램 다른 곳에서 가비지 컬렉트되면 해당키도 WeakValueDictonary
에서 자동 제거된다. 이 클래스는 일반적으로 캐시를 구현하기 위해 사용된다.
class Cheese:
def __init__(self, kind):
self.kind = kind
def __repr__(self):
return 'Cheese(%r)' % self.kind
import weakref
stock = weakref.WeakValueDictionary()
catalog = [Cheese('Red Leicester'), Cheese('Tilsit'),
Cheese('Brie'), Cheese('Parmesan')]
for cheese in catalog:
stock[cheese.kind] = cheese
print(sorted(stock.keys()))
del catalog
print(sorted(stock.keys()))
del cheese
print(sorted(stock.keys()))
catalog 에 들어 있는 각종 치즈가 WeakValueDictionary로
구현되어 있는 stock 배열에 로딩된다. 그런데 catalog를 제거하자마자 stock에
있는 치즈가 하나만 빼고 모두 사라진다.
- stock 은 WeakValueDictionary 객체다.
- stock 은 치즈명을 catalog 에 있는 Cheese 객체에 대한 참조로 매핑한다.
- stock 에 모든 치즈명이 들어있다.
- catalog 를 제거한 후, 예상한 대로 WeakValueDictionary 객체인 stock에서 대부분의 치즈가 사라졌다.
- 그런데 하나가 남아있는 이유는?
Tip - 임시 변수가 객체를 참조함으로써 예상보다 객체의 수명이 늘어날 수 있다.
지역 변수는 함수가 반환되면서 사라지므로 일반적으로 문제가 되지 않는다.
명시적으로 제거하기 전에는 사라지지 않는다.
728x90
'Python > python - pythonic' 카테고리의 다른 글
데코레이터를 이해하기전 알아야 할것들 (0) | 2020.12.06 |
---|---|
벡터 클래스의 부활 (0) | 2020.12.04 |
약한참조 (2) | 2020.12.02 |
del 과 가비지 컬렉션 (0) | 2020.12.02 |
간단한 데커레이터 구현하기 (0) | 2020.11.28 |
댓글
이 글 공유하기
다른 글
-
데코레이터를 이해하기전 알아야 할것들
데코레이터를 이해하기전 알아야 할것들
2020.12.06 -
벡터 클래스의 부활
벡터 클래스의 부활
2020.12.04 -
약한참조
약한참조
2020.12.02 -
del 과 가비지 컬렉션
del 과 가비지 컬렉션
2020.12.02