문제의 역사:
딕셔너리(dict)는 키-값 구조를 나타내는 파이썬의 기본 데이터 유형 중 하나입니다. 딕셔너리는 처음부터 존재했지만, 내부 구현 및 동작의 특징이 지속적으로 개선되었습니다(예를 들어, 파이썬 3.7부터는 삽입 순서가 보장됩니다).
문제:
딕셔너리의 구조를 이해하는 것은 효율적인 코드 작성을 위해 필수적입니다. 변동 가능한 유형을 키로 사용할 때 발생하는 버그, 중첩된 딕셔너리를 복사할 때 발생하는 문제, 비표준 작업을 수행할 때의 문제가 발생할 수 있습니다.
해결책:
딕셔너리는 해시 테이블로 구현되며, 키는 반드시 해시 가능해야 합니다(immutable). 키를 통해 값에 접근하는 것은 O(1)에 가깝지만, 특정 조건에서는 특이점이 발생할 수 있습니다 — 예를 들어, 충돌이 발생하거나 대량의 데이터로 작업할 때 발생합니다.
예제 코드:
person = {'name': 'Alice', 'age': 30} person['city'] = 'Moscow' print(person['name']) # Alice
주요 특징들:
list를 dict의 키로 사용할 수 있습니까?
아니요, 리스트는 변경 가능하며 해시할 수 없습니다. 리스트를 사용하려고 하면 오류가 발생합니다.
d = {} d[[1, 2, 3]] = 'value' # TypeError: unhashable type: 'list'
같은 내용을 가진 두 개의 튜플을 키로 사용하면 어떻게 됩니까?
두 튜플이 동일한 데이터를 포함하고, 변경할 수 없는 경우에는 동일하다고 간주되며, 딕셔너리의 키가 일치합니다:
t1 = (1, 2) t2 = (1, 2) d = {t1: 'a'} print(d[t2]) # 'a'
딕셔너리를 복사할 때 요소의 순서가 변경됩니까?
파이썬 3.7 이상에서는 순서가 유지됩니다. 이전 버전에서는 순서를 보장하지 않습니다.
d1 = {'a': 1, 'b': 2} d2 = dict(d1) print(list(d2)) # ['a', 'b']
dict.get()을 사용하는 것은 값이 == None인 경우 예기치 않은 오류를 초래할 수 있습니다.프로그래머가 키로 리스트를 사용하며, tuple과 list가 파이썬에서 동등하다고 잘못 생각합니다. "unhashable type"와 같은 예외를 겪습니다.
장점:
무언가를 "즉석에서" 빠르게 시도해 보고, 다양한 구조를 사용해 볼 수 있습니다.
단점:
런타임 오류, 데이터 처리 중 버그가 발생할 수 있습니다.
키로는 오직 변경할 수 없는(해시 가능한) 객체만 사용되며, 튜플은 변경 가능한 요소를 포함하지 않도록 설계되었습니다.
장점:
키별 검색 속도, 구조의 안정성, 쉬운 처리 및 복사를 제공합니다.
단점:
데이터가 복잡할 경우, 구조를 변경 불가능한 형태로 변환하기 위한 추가 처리가 필요합니다(예: 튜플 내부의 직렬화).