PYTHON · 컬렉션
불변 컬렉션
Python에서 불변 컬렉션을 활용하여 안전한 데이터 구조를 만드는 방법입니다.
컬렉션고급immutable불변MappingProxyTypefrozen
핵심 설명
Python에서 불변 컬렉션을 활용하여 안전한 데이터 구조를 만드는 방법입니다.
Python code
from types import MappingProxyType
from dataclasses import dataclass, field
# MappingProxyType: 읽기 전용 딕셔너리 뷰
original = {"a": 1, "b": 2, "c": 3}
readonly = MappingProxyType(original)
print(readonly["a"]) # 1
# readonly["a"] = 10 # TypeError!
# 원본 변경은 뷰에 반영됨
original["d"] = 4
print(readonly["d"]) # 4
# 불변 데이터클래스
@dataclass(frozen=True)
class Config:
host: str
port: int
tags: tuple[str, ...] = () # 불변 시퀀스
def with_port(self, new_port: int) -> "Config":
"""변경된 복사본 반환"""
return Config(self.host, new_port, self.tags)
cfg = Config("localhost", 8080, ("web", "api"))
# cfg.port = 9090 # FrozenInstanceError
cfg2 = cfg.with_port(9090)
print(f"{cfg.port} → {cfg2.port}") # 8080 → 9090
# 해시 가능 (딕셔너리 키로 사용 가능)
cache = {cfg: "기본 설정", cfg2: "새 설정"}
print(cache[cfg]) # 기본 설정학습 팁
불변 데이터클래스는 해시 가능하므로 딕셔너리 키나 세트 원소로 사용할 수 있습니다.
주의할 점
frozen=True 데이터클래스에 mutable 필드(리스트)를 넣으면 외부에서 내용을 변경할 수 있습니다. 튜플이나 frozenset을 사용하세요.
자주 묻는 질문
불변 컬렉션란 무엇인가요?
Python에서 불변 컬렉션을 활용하여 안전한 데이터 구조를 만드는 방법입니다.
불변 컬렉션 학습 시 주의할 점은 무엇인가요?
frozen=True 데이터클래스에 mutable 필드(리스트)를 넣으면 외부에서 내용을 변경할 수 있습니다. 튜플이나 frozenset을 사용하세요.