파이썬으로 코딩을 하다보면
TypeError: Unhashable Type: 'List'
이라는 에러를 만날 수 있다. 잘 읽어보면 list는 해싱할 수 없다는 말이다.
이러한 에러는 데이터 타입이 해싱이 불가능한데, 해싱 가능한 데이터를 요구하는 코드에서 사용하면 발생한다. 예를 들면 set이나 list를 dict의 key로 사용하면 그렇다.
해싱은 객체를 해시 테이블에 저장하여 빠른 검색, 삽입, 삭제를 가능하게 하는 처리 방법이다. 파이썬에서 객체가 hashable하려면 그 해시값이 생성된 후 변하지 않는 '불변성(immutability)'을 가져야 한다.
불변성 있는 객체란, 인스턴스가 메모리를 할당받아 생성되고 나면 그 상태가 변하지 않는 것을 의미한다. 파이썬에서는 Tuple, int, String, Frozenset이 불변형이고, List, Dictionary, Set이 가변형이다.
hashable 하려면 가능하려면 불변성 객체여야 한다. 왜냐하면 해시는 해시값을 키로 사용해 데이터를 저장한다. 이때 해시 값이 변하면 그 객체의 저장 위치가 변하거나 위치를 잘못 참조해 데이터 무결성이 깨질 수 있다. 따라서 가변형 객체를 dict의 key로 사용하면 Unhashable Type: 'List'
와 같은 에러를 만날 수 있다.
해싱할 수 없는 타입의 객체를 dictionary의 키로 사용하고 싶다면, 그 객체를 불변형으로 변환할 수 있다. 예를 들어, 리스트는 튜플로 변환할 수 있다. 하지만 항상 가능한 것은 아니니 명심하자.
불변성 객체가 아닌 값을 해시 키로 사용하면 TypeError: Unhashable Type
라는 에러를 만날 수 있다! 왜냐하면 해시는 데이터 무결성이 매우 중요하기 때문이다!!!
파이썬은 아주 쉽고 간단한 언어라고 생각해왔지만 잘 파고들면 요런 저런 특징이 많다! 이 또한 원리를 잘 파악하고 사용하자!~~ 에러 무시 금지~!!
https://rollbar.com/blog/handling-unhashable-type-list-exceptions/
https://jiwonkoh.tistory.com/40
그림출처 : https://namu.wiki/w/%ED%95%B4%EC%8B%9C