본문 바로가기
카테고리 없음

파이썬 ‘TypeError: unhashable type’ 오류 해결법

by vibespace 2025. 5. 25.

파이썬에서 ‘TypeError: unhashable type’ 오류란?

파이썬에서 발생하는 ‘TypeError: unhashable type’ 오류는 주로 불변(immutable)하지 않은 객체를 해시 가능한 자료형에 넣으려고 할 때 발생합니다. 해시 가능하다는 것은 객체가 고유한 해시 값을 가지고, 그 값이 변경되지 않는다는 것을 의미합니다. 이 오류는 주로 set이나 dict와 같은 해시를 사용하는 자료형에 불변 객체가 아닌 타입을 추가하려 할 때 발생합니다. 이 글에서는 ‘TypeError: unhashable type’ 오류의 원인과 해결 방법에 대해 설명하겠습니다.

‘TypeError: unhashable type’ 오류의 원인

이 오류가 발생하는 주요 원인은 불변 객체가 아닌 객체를 해시 가능한 자료형에 넣으려고 할 때입니다. 파이썬에서 해시 가능한 객체는 변하지 않는 객체여야 합니다. 즉, 리스트나 딕셔너리, 집합(set)은 변경 가능한 객체로, 해시 값을 가질 수 없기 때문에 해시 가능한 자료형에 포함될 수 없습니다.

  • 리스트: 리스트는 내부적으로 값을 변경할 수 있기 때문에 해시 가능한 객체로 사용할 수 없습니다.
  • 딕셔너리: 딕셔너리는 키-값 쌍을 저장하지만, 키 자체는 해시 가능한 객체여야 합니다. 그러나 다른 딕셔너리나 리스트와 같은 변경 가능한 객체는 해시할 수 없으므로 키로 사용할 수 없습니다.
  • 집합(set): 집합은 값의 중복을 허용하지 않지만, 내부 요소가 변경 가능하면 해시할 수 없기 때문에 TypeError: unhashable type 오류가 발생합니다.

‘TypeError: unhashable type’ 오류 해결 방법

‘TypeError: unhashable type’ 오류를 해결하려면, 변경 가능한 객체를 해시 가능한 객체로 대체하거나, 해시 가능한 객체로 변환해야 합니다. 아래에 몇 가지 해결 방법을 소개합니다.

1. 리스트 대신 튜플 사용하기

리스트는 변경 가능한 객체이므로 집합(set)이나 딕셔너리의 키로 사용할 수 없습니다. 하지만 리스트 대신 튜플을 사용하면 변경 불가능한 객체로 취급되어 해시 가능한 자료형으로 사용할 수 있습니다. 튜플은 리스트와 유사하지만, 한 번 생성되면 값을 변경할 수 없는 불변 객체입니다.

# 오류 발생 예시
my_set = { [1, 2, 3], [4, 5, 6] }  # TypeError 발생

# 해결 방법
my_set = { (1, 2, 3), (4, 5, 6) }  # 튜플을 사용하여 해결
print(my_set)

위 코드에서 리스트를 튜플로 변경하여 set에 저장할 수 있습니다. 이렇게 하면 ‘TypeError: unhashable type’ 오류를 해결할 수 있습니다.

2. 딕셔너리 키에 튜플 사용하기

딕셔너리에서 키는 반드시 해시 가능한 객체여야 합니다. 만약 리스트나 다른 변경 가능한 객체를 키로 사용하려 한다면, 이를 튜플로 변경해야 합니다. 튜플은 해시 가능한 객체로 사용될 수 있기 때문에 딕셔너리의 키로 사용할 수 있습니다.

# 오류 발생 예시
my_dict = { [1, 2]: "value" }  # TypeError 발생

# 해결 방법
my_dict = { (1, 2): "value" }  # 튜플을 키로 사용하여 해결
print(my_dict)

위 코드에서 리스트를 튜플로 변경하여 딕셔너리의 키로 사용할 수 있습니다. 이를 통해 ‘TypeError: unhashable type’ 오류를 피할 수 있습니다.

3. 변경 가능한 객체를 고유한 객체로 변경하기

만약 집합이나 딕셔너리에서 사용하려는 객체가 변경 가능한 객체라면, 해당 객체를 고유한 객체로 변경할 수 있는 방법을 찾아야 합니다. 예를 들어, 리스트를 직접 사용해야 하는 경우, 리스트의 요소를 튜플로 변환하거나 불변 객체로 바꿀 수 있습니다.

# 리스트를 집합에 넣으려 할 때
my_list = [1, 2, 3]

# 리스트를 튜플로 변환
my_set = { tuple(my_list) }  # 튜플로 변환하여 집합에 저장
print(my_set)

위 코드에서는 리스트를 튜플로 변환한 후 집합에 넣을 수 있게 되어 오류를 방지할 수 있습니다.

4. 변경 불가능한 자료형을 사용하여 데이터 구조 설계하기

파이썬에서 집합(set)이나 딕셔너리의 키로 사용할 데이터 구조를 설계할 때, 가능하면 불변(immutable) 자료형을 사용하도록 노력해야 합니다. 불변 자료형을 사용하면 해시 가능한 객체로 안전하게 사용할 수 있기 때문에, ‘TypeError: unhashable type’ 오류를 방지할 수 있습니다.

‘TypeError: unhashable type’ 오류 예방을 위한 팁

‘TypeError: unhashable type’ 오류를 예방하려면, 해시 가능한 객체를 사용하는 것이 중요합니다. 아래는 오류를 예방할 수 있는 몇 가지 팁입니다:

  • 변경 가능한 객체는 집합(set)이나 딕셔너리의 키로 사용하지 마세요.
  • 리스트 대신 튜플과 같은 불변 객체를 사용하세요.
  • 집합이나 딕셔너리에서 사용하려는 객체가 변경 가능한 경우, 이를 튜플 등의 불변 객체로 변환하세요.
  • 데이터 구조 설계 시 불변 자료형을 사용하여 안전하게 데이터를 처리하세요.

결론

‘TypeError: unhashable type’ 오류는 해시 가능한 객체에 변경 가능한 객체를 넣으려고 할 때 발생하는 오류입니다. 이 오류를 해결하려면, 리스트와 같은 변경 가능한 객체를 튜플로 바꾸거나, 다른 불변 자료형을 사용해야 합니다. 이러한 해결 방법을 적용하면 ‘TypeError: unhashable type’ 오류를 예방하고, 파이썬에서 해시 가능한 자료형을 안전하게 사용할 수 있습니다.