파이썬 ‘TypeError: unhashable type’ 오류 해결법
파이썬에서 ‘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’ 오류를 예방하고, 파이썬에서 해시 가능한 자료형을 안전하게 사용할 수 있습니다.