hashable object란 무엇인가?
python의 hashable object은 hash함수에 인자로 들어갈 수 있는 객체들을 의미한다. hashable에 대한 정의로 또 hash라는 단어가 들어갔다. 그럼 이번에 hash라는 것이 무엇인지 알아보면 될 것이다.
hash(object): object의 저장된 내용을 기준으로 한 개의 정수를 생성하여 반환하는 함수
- 이 함수는 hasher라고도 부른다. hash 함수안에 인자로 들어가는 object은 하나의 값일 수도 있고, 여러 개의 값을 갖고 있는 컨테이너 일 수도 있다. 즉, 내용이 뭐든지간에(사실, 조건이 없진 않다..), 이에 해당하는 숫자 하나를 무조건 생성한다고 생각하면 된다. 아래의 예시처럼, string이 무엇이든 간에 hash function을 통과하고나면 무조건 하나의 숫자로 반환되는 함수를 의미한다. 이는 튜플일 수도 있는데 (1, 2, 3) 을 hash function에 넣어, 2366528764324이 나왔다고 하면, 이 튜플은 hashable object 라고 부른다.
image resource: https://medium.com/better-programming/3-essential-questions-about-hashable-in-python-33e981042bcb
hashable은 왜 필요할까?
비교를 위해 사용된다. 즉, hash을 하고나면, 각 객체가 숫자로 나오기 때문에, 같은 객체인지 다른객체인지 비교가 가능하다. 같은 숫자면 같은 객체로 인식한다. 또한, 컨테이너인 객체들도, hash을 이용하면 한번에 비교가 가능하다. 가령 (a, b, c)인 객체와 (d, b, c)인 객체를 비교할 대도, 각각의 원소들이 같은지 여러번 비교를 하는 것이 아니라, hash 값만 있으면 비교가 가능하므로, 한 번의 비교 연산만이 필요하다. 즉, 1) Computationally robust함을 유지하기 하기위해 사용된다 (쉽게 말하면, 다른 객체는 다른 해시함수를 갖어야한다). 다른 객체들이 같은 해시를 가지면 충돌이 일어날 수 있다. 2) 같은 오브젝트가 일관성 있게, 같은 값을 가질 수 있도록 표식한다.
모든 오브젝트는 hashable할까?
리스트라든가 셋, 딕셔너리와 같이 데이터 변경이 가능한 컨테이너은 hashable하지 않다. 이유는 데이터가 변경가능한(immutable)한 객체들은 해시를 만들어놓고도, 중간에 데이터가 변경되면 해쉬값도 매번 변경되어야되기 때문에, 이런경우 type error가 발생한다. 즉, Numeric, immutable container은 hashable이다.
생각해보면, 숫자(int, bool, float)은 그 자체로 숫자이기 때문에, 숫자 중간을 바꿀 수 없고, 변경불가능한 컨테이너(immutable container)은 tuple, string, bytes, forzenset도 변경이 불가능하기 때문에 hashable하다. 또한, numeric 들은 int이든 bool이든 float은 타입이 다르더라도 비교해서 동등을 알 수 있다. 아래의 예시를보면 1이든 True (bool type) 이든 hash값이 동일해서, 동등비교를해도 True인 것을 알 수 있다.
이를 이용하는 경우, 중복여부를 빠르게 판단할 수 있는데, 중복이 없어야하는 dict, set의 item을 비교할 때 사용될 수 있다. 따라서, set과 dict의 key값들은 중복이 되면 안되기에, hashable해야한다.
'Data science > Python' 카테고리의 다른 글
[Jupyter notebook] 가상환경 커널 이용하기 (0) | 2021.02.09 |
---|---|
[Pycharm] Docstring 기본 세팅 (0) | 2021.02.06 |
numpy debugging (0) | 2020.02.08 |
0. Python 이란?: 언어형태, 특징, 메모리관리 (0) | 2019.06.16 |
python 시각화 : Seaborn (0) | 2019.06.10 |