파이썬 엔진은 사실 키 : 값의 형태인 거대한 해시테이블 형태라고도 한다. 출처는 찾아봐야 할겠지만… 강사는 그렇다고 함. 딕셔너리타입이 해시 테이블의 한 예시이기도 함. 따라서 해시 테이블을 직접 구현할 필요는 없다.
해시테이블의 장점은 키 값만 안다면 값에 $O(1)$의 속도로 접근이 가능하다는 점이다.
# Dict 구조
print(__builtins__.__dict__)
파이썬 내부의 빌트인함수들을 dict구조로 살펴보자.
모두 키:값의 형태로 이루어져있는 것을 볼 수 있다.
hash()
함수는 불변하는 자료구조에 의해서만 사용할 수 있다.
t1 = (10, 20, (30, 40, 50))
t2 = (10, 20, [30, 40, 50])
print(hash(t1))
print(hash(t2)) # 에러, 리스트는 해시함수 사용 불가
튜플은 불변하기 때문에 해시함수를 적용할 수 있다. 반면에 리스트는
오류가 난다. hash()함수는 동일한 값에 대해 항상 같은 결과를 반환해야만 한다. 가변 객체는 값이 바뀌면 같은 객체 참조값(id등)임에도 다른 해쉬값이 나올 수 있기 때문에 사용자체를 막아둔 것이다.
# Dict Setdefault
source = (('k1', 'val1'),
('k1', 'val2'),
('k2', 'val3'),
('k3', 'val4'))