더북(TheBook)

이 예제에서 보인 것처럼 리스트는 사전에서 값으로 쓸 수 있으며 키가 될 수 없다. 만약 리스트를 키로 하면 무슨 일이 일어나는지 보자.

>>> t = [1, 2, 3]

>>> d = dict()

>>> d[t] = 'oops'

Traceback (most recent call last):

File "<stdin>", line 1, in ?

TypeError: list objects are unhashable

앞에서 사전은 해시테이블을 사용하여 구현되었다고 얘기했는데, 이는 키가 해시 가능(hashable)해야 한다는 뜻이다.

해시(hash)는 (어떤 종류의) 값을 받아서 정수를 반환하는 함수를 말한다. 사전은 바로 이 정수(해시 값)를 사용해서 키-값 쌍을 저장하고 조회한다.

이 시스템은 키가 불변일 때 잘 동작한다. 하지만 키가 리스트처럼 변경 가능하면 나쁜 상황이 발생한다. 예를 들어 키-값 쌍을 생성할 때 파이썬은 키에서 해시를 생성하고, 키를 해시에 해당하는 위치에 저장한다. 키를 수정하고 키에서 해시를 다시 생성하면 키는 다른 위치가 된다. 이런 경우 같은 키에 대해 두 개의 항목을 갖게 되거나 키를 찾을 수 없게 된다. 어느 쪽이든 사전은 올바르게 동작할 수 없게 된다.

이런 이유로 키는 해시 가능해야 하며 리스트 같은 변경 가능한 타입은 해시 가능이 아니다. 이러한 제약을 해결하는 가장 간단한 방법은 튜플(tuple)을 사용하는 것이다. 튜플에 대해서는 다음 장에서 살펴볼 것이다.

사전은 변경 가능하므로 사전은 키로 사용할 수 없지만, 값으로 사용할 수는 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.