my_dict = dict()
my_dict[(0,0)] = 1
딕셔너리인데 키 값이 튜플이다.
이 경우 문제 없이 실행될까?
결론부터 말하면, 된다!
키(key) | 값(value) |
10 | "민수" |
20 | "상호" |
30 | "수현" |
딕셔너리는 키-값 쌍으로 이루어진 자료형이다.
파이썬에 내장된 딕셔너리는 '해시 테이블' (Hash table) 구조로 구현되어 있다.
해시 테이블을 논리적으로 표현하면 다음과 같은 모양이다.
# Logical model of Python Hash table
-+-----------------+
0| <hash|key|value>|
-+-----------------+
1| ... |
-+-----------------+
.| ... |
-+-----------------+
i| ... |
-+-----------------+
.| ... |
-+-----------------+
n| ... |
-+-----------------+
0~n으로 표시된 인덱스는 편의상 표기한 것으로, 실제로 저장되는 값은 아니다.
<해시, 키, 값> 형태의 데이터가 연속적으로 메모리에 저장되는 구조다.
(참고)
파이썬 딕셔너리를 구현한 C 코드의 일부의 모습이다.
<해시, 키, 값> 을 저장할 수 있는 구조체 형태다.
typedef struct {
/* Cached hash code of me_key. */
Py_hash_t me_hash;
PyObject *me_key;
PyObject *me_value;
} PyDictEntry;
'키'와 '값'은 평소에도 딕셔너리를 사용할 때 많이 쓰기 때문에 익숙한 개념이다.
딕셔너리를 저장할 때 해시는 왜 필요한 것일까?
해시는 '빠른 데이터 탐색' 을 위해 필요하다. 딕셔너리에 값을 저장할 때 키 값은 고유한 '해시' 로 변환되는데, 이 해시는 탐색 시 인덱스로 활용되어 O(1) 의 속도로 값을 찾아낼 수 있도록 한다.
비유하자면, 수 백개의 방문이 있는 호텔에서 내가 어떤 주문(키)을 외치면 그 주문에 맞는 열쇠(해시)가 만들어져 단숨에 방 문 앞으로 보내준다고 생각할 수 있겠다.
이때, 키를 해시로 만드는 데에는 해시함수가 사용된다.
이 해시 함수는 아주 예민해서, 키 값이 조금이라도 달라지면 완전히 다른 해시 값을 내놓는다. (눈사태 효과)
느낌표 하나만 추가되었을 뿐인데 해시 값은 완전히 달라졌다
딕셔너리에서 키 값이 조금이라도 달라진다면, 해시 또한 완전히 달라져버릴 것이다.
그렇게 되면 해시를 통해 값에 접근할 수 없게 된다.
따라서 딕셔너리에 사용되는 키는 불변하며 일관성이 있어야 한다.
딕셔너리에 사용될 수 있는 키를 해시 사용성(Hashability)이 있다고 한다.
튜플은 변하지 않는다. 즉, 튜플은 hashable 하다.
딕셔너리의 키로 변수 또는 리스트가 사용될 수 없는 것과 대조적이다.
결론적으로, 파이썬에서 튜플은 딕셔너리의 키로 사용할 수 있다.
my_dict[(0,0)] = True .. 와 같은 형태가 가능하다는 말인데,
(x, y) 튜플을 만들어 키로 사용하면 좌표에 대한 값을 매핑할 때 유용할 수 있을 것 같다.
'개발 > Python' 카테고리의 다른 글
[파이썬으로 배우는 컴퓨팅 사고] 챕터6 확인학습 답 (2) | 2021.05.11 |
---|---|
[파이썬으로 배우는 컴퓨팅 사고] 챕터5 확인학습 답 (0) | 2021.05.11 |
[파이썬으로 배우는 컴퓨팅 사고] 챕터4 확인학습 답 (0) | 2021.05.11 |
[파이썬으로 배우는 컴퓨팅 사고] 챕터3 확인학습 답 (0) | 2020.06.14 |
[파이썬으로 배우는 컴퓨팅 사고] 챕터2 확인학습 답 (0) | 2020.06.14 |