Python에서 "해시블"은 무엇을 의미합니까?
인터넷 검색을 해봤지만 해시 가능의 의미를 찾을 수 없었습니다.
라고 hashable
★★★★★★★★★★★★★★★★★」hashable objects
것은은 무엇 ?? ????
Python 용어집:
그, 합니다(이 는, 「해시 가능」이 에는 「해시 가능」
__hash__()
및 할 수 (메서드가 합니다).__eq__()
★★★★★★★★★★★★★★★★★」__cmp__()
을 비교하는 해시 값을 합니다.동일한 해시 가능 개체는 동일한 해시 값을 가져야 합니다.이러한 데이터 구조에서는 내부적으로 해시 값을 사용하기 때문에 해시 가능성은 개체를 사전 키 및 세트 멤버로 사용할 수 있게 합니다.
Python의 모든 불변 빌트인 객체는 해시 가능하지만 목록이나 사전과 같은 가변 컨테이너는 해시 가능하지 않습니다.인 오브젝트는 해시 오브젝트는 하지 않습니다은 그 입니다.이러한 오브젝트는 모두 동등하지 않으며 해시 값은
id()
.
여기 있는 모든 답변은 파이썬의 해시 가능한 오브젝트에 대한 적절한 설명이 있지만, 먼저 해시라는 용어를 이해할 필요가 있다고 생각합니다.
해싱은 컴퓨터 사이언스의 개념으로 대량의 데이터를 신속하게 저장하고 액세스하는 고성능 의사 랜덤 액세스 데이터 구조를 만드는 데 사용됩니다.
예를 들어 10,000개의 전화번호를 가지고 있으며, 이를 배열(인접 메모리 위치에 데이터를 저장하고 랜덤액세스를 제공하는 시퀀셜 데이터 구조)에 저장하는 경우 필요한 양의 연속 메모리 위치가 없을 수 있습니다.
따라서 크기가 100인 배열을 사용하여 해시 함수를 사용하여 일련의 값을 동일한 인덱스에 매핑할 수 있습니다.이러한 값은 링크 목록에 저장할 수 있습니다.이는 어레이와 유사한 성능을 제공합니다.
해시 함수는 숫자를 배열 크기로 나누고 나머지를 인덱스로 취하기만 하면 됩니다.
상세한 것에 대하여는, https://en.wikipedia.org/wiki/Hash_function 를 참조해 주세요.
여기 또 다른 참고 자료가 있습니다.http://interactivepython.org/runestone/static/pythonds/SortSearch/Hashing.html
변경할 수 없는 모든 것(변환 가능한 수단, 변경 가능성 있음)은 해시할 수 있습니다.클래스에 해시 함수가 있는 경우 검색하기 위한 해시 함수 외에 예를 들어 다음과 같습니다. dir(tuple)
요.__hash__
를 들어 과 같은 방법이 .
#x = hash(set([1,2])) #set unhashable
x = hash(frozenset([1,2])) #hashable
#x = hash(([1,2], [2,3])) #tuple of mutable objects, unhashable
x = hash((1,2,3)) #tuple of immutable objects, hashable
#x = hash()
#x = hash({1,2}) #list of mutable objects, unhashable
#x = hash([1,2,3]) #list of immutable objects, unhashable
불변 유형 목록:
int, float, decimal, complex, bool, string, tuple, range, frozenset, bytes
가변 유형 목록:
list, dict, set, bytearray, user-defined classes
Python 용어집에 따르면 해시 가능한 오브젝트의 인스턴스를 만들 때 변경 불가능한 값도 인스턴스의 멤버나 값에 따라 계산됩니다.예를 들어, 이 값은 다음과 같이 사전의 키로 사용될 수 있습니다.
>>> tuple_a = (1, 2, 3)
>>> tuple_a.__hash__()
2528502973977326415
>>> tuple_b = (2, 3, 4)
>>> tuple_b.__hash__()
3789705017596477050
>>> tuple_c = (1, 2, 3)
>>> tuple_c.__hash__()
2528502973977326415
>>> id(tuple_a) == id(tuple_c) # tuple_a and tuple_c same object?
False
>>> tuple_a.__hash__() == tuple_c.__hash__() # hash of tuple_a and tuple_c same value?
True
>>> dict_a = {}
>>> dict_a[tuple_a] = 'hiahia'
>>> dict_a[tuple_c]
'hiahia'
「」의 는, 「」라고 하는 을 알 수 .tuple_a
★★★★★★★★★★★★★★★★★」tuple_c
츠미야★★★★★★를 사용하는 경우tuple_a
in의 dict_a
하면 '어울리지 않다'의알 수 있습니다dict_a[tuple_c]
는 같습니다.즉, 사전에서 키로 사용되는 경우 해시 값이 같기 때문에 같은 값이 반환됩니다.수 " " " 입니다.__hash__
되어 있습니다.None
:
>>> type(dict.__hash__)
<class 'NoneType'>
이 해시 값은 인스턴스의 초기화에 따라 계산되며 동적 방식이 아니기 때문에 해시 가능한 것은 불변의 객체뿐입니다.이게 도움이 됐으면 좋겠다.
해시 가능 = 해시 가능.
그래, 해시가 뭔데?해싱 함수는 Python 등의 문자열을 사용하여 오브젝트를 취득하여 고정 크기의 코드를 반환하는 함수입니다.알기 쉽게 하기 위해 반환값을 정수라고 가정합니다.
Python 3에서 해시('Python')를 실행하면 5952713340227947791이 나옵니다.다른 버전의 Python은 기본 해시 함수를 자유롭게 변경할 수 있으므로 다른 값을 얻을 수 있습니다.중요한 것은 해시('Python')를 여러 번 실행해도 동일한 버전의 Python에서 항상 같은 결과를 얻을 수 있다는 것입니다.
그러나 해시('Java')는 1753925553814008565를 반환합니다.따라서 해시 중인 개체가 변경되면 결과도 변경됩니다.한편, 해시하고 있는 오브젝트가 변경되지 않으면 결과는 그대로입니다.
이게 왜 중요하죠?
예를 들어 Python 사전은 키가 불변해야 합니다.즉, 키는 변경되지 않는 개체여야 합니다.문자열은 다른 기본 유형(int, float, bool)과 마찬가지로 Python에서 불변합니다.술잔과 프로젠셋 또한 불변이다.한편, 리스트는 변경할 수 있기 때문에 불변(즉, 변경할 수 있습니다)은 아닙니다.마찬가지로 딕트도 변경할 수 있습니다.
그래서 우리가 어떤 것이 해시가능하다고 말할 때, 우리는 그것이 불변하다는 것을 의미합니다.hash() 함수에 변환 가능한 유형을 전달하려고 하면 실패합니다.
>>> hash('Python')
1687380313081734297
>>> hash('Java')
1753925553814008565
>>>
>>> hash([1, 2])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash({1, 2})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> hash({1 : 2})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>>
>>> hash(frozenset({1, 2}))
-1834016341293975159
>>> hash((1, 2))
3713081631934410656
Python에서는 모든 불변의 객체(예: 정수, 부울, 문자열, 태플)가 해시 가능하므로 그 값은 수명 동안 변경되지 않습니다.이를 통해 Python은 고유한 해시 값을 생성하여 식별할 수 있습니다. 이 해시 값은 사전에서 고유한 키와 집합을 추적하여 고유한 값을 추적할 수 있습니다.
이것이 바로 Python이 사전에 있는 키에 불변의 데이터형을 사용하도록 요구하는 이유입니다.
python의 해시 가능한 오브젝트를 이해하기 위한 작업 예를 제시하겠습니다.이 예에서는 Tuples 2개를 사용하고 있습니다.태플의 각 값에는 라이프 타임 동안 변경되지 않는 고유한 해시 값이 있습니다.이 값을 바탕으로 두 튜플을 비교합니다.Id()를 사용하여 태플 요소의 해시 값을 얻을 수 있습니다.
python에서는 오브젝트가 인덱스를 반환하기 위해 집합의 멤버가 될 수 있음을 의미합니다.즉, ID가 고유합니다.
예를 들어 python 3.3의 경우:
데이터 구조 목록은 해시할 수 없지만 데이터 구조 탭은 해시할 수 있습니다.
다른 답변과 함께:Python 용어집에는 "사용자 정의 클래스의 인스턴스인 개체는 기본적으로 해시 가능합니다."라고 나와 있습니다.그러나 "같음을 비교하는 해시 가능한 개체는 동일한 해시 값을 가져야 합니다."라고 쓰여 있습니다.
이를 통해 다음 명령어를 구현한 경우__eq__
- 실장하지 않은 방법__hash__
- 객체의 메서드는 해시할 수 없습니다.그 이외의 경우에서 해시를 취득합니다.id()
는, 같은 것을 비교하는 2개의 오브젝트에 대해서, 같은 해시가 생성되는 것을 보증하지 않습니다(id(a) != id(b)
그렇지만a == b
)
>>> class Foo(object):
... def __eq__(self, other): pass
...
>>>
>>> class Bar(object):
... pass
...
>>> f = Foo()
>>> b = Bar()
>>>
>>> hash(f)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'Foo'
>>> hash(b)
8758325844794
해시 테이블을 처음부터 작성하려면 모든 값을 "없음"으로 설정하고 요구 사항이 발생하면 수정해야 합니다.해시 가능한 개체는 수정 가능한 데이터 유형(사전, 목록 등)을 나타냅니다.한편, 한 번 할당된 세트는 재초기화할 수 없으므로 세트는 해시할 수 없습니다.반면 set() --frozenset()의 변형은 해시 가능합니다.
언급URL : https://stackoverflow.com/questions/14535730/what-does-hashable-mean-in-python
'programing' 카테고리의 다른 글
SQL Attendance 데이터베이스 설계 (0) | 2022.11.22 |
---|---|
데이터베이스 내의 모든 테이블을 하나의 스테이트먼트로 기술하려면 어떻게 해야 합니까? (0) | 2022.11.22 |
최대 절전 모드를 사용하는 Mariadb 동적 열 (0) | 2022.11.22 |
클래스는 클래스를 확장하고 인터페이스를 구현할 수 있습니까? (0) | 2022.11.22 |
쿼리 구문으로 바꾸기 (0) | 2022.11.22 |