본문 바로가기

프로그래밍/Python

[Python] 리스트를 딕셔너리의 키로 사용하려 하는데 에러가 발생한다. TypeError: unhashable type

반응형

리스트를 딕셔너리의 키로 사용하려 하면 에러가 발생한다. 이럴 때에는 리스트를 튜플(tuple)로 변환하면 키로 사용할 수 있다. 아래 간단한 샘플코드를 참조하면 되겠다.

>>> d = {}
>>> l = [1,2]
>>> d[l] = 33
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    d[l] = 33
TypeError: unhashable type: 'list'
>>> d[[3,7]] = 27
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    d[[3,7]] = 27
TypeError: unhashable type: 'list'
>>> d[tuple(l)] = 33
>>> d
{(1, 2): 33}
>>> d[(3, 7)] = 27
>>> d
{(1, 2): 33, (3, 7): 27}
>>> 

발생하는 에러 메시지는 "TypeError: unhashable type: 'list' " 라고 나온다. 해석해 보면, "타입에러: 해시할 수 없는 타입: 리스트" 이런 것인데, 무슨 말인고 하니,

set이나 딕셔너리의 키의 원소는 해시할 수 있는 "변형이 불가능한" (immutable) 값이어야 한다. 리스트와 튜플의 차이는 리스트는 리스트에 원소를 더하거나 빼거나 할 수 있는 변형이 가능한 타입이다. 튜플은, 반면, 한번 정의되면 변형이 불가능한 타입이다. 처음 리스트와 튜플에 대해 학습할 때, 이 차이가 무엇인지 의아하게 생각하고 넘어갔을텐데, 이 포스팅에서 다루는 문제와 같은 경우에 차이를 볼 수 있다.

 

728x90