Я попробовал поиск в Интернете, но не смог найти значение hashable.
Когда они говорят, что объекты hashable
или hashable objects
, что это значит?
Я попробовал поиск в Интернете, но не смог найти значение hashable.
Когда они говорят, что объекты hashable
или hashable objects
, что это значит?
Из глоссарий Python:
Объект hashable, если он имеет значение хэша, которое никогда не изменяется в течение его жизненного цикла (ему нужен метод
__hash__()
), и его можно сравнить с другими объектами (ему нужен метод__eq__()
или__cmp__()
). Объекты Hashable, которые сравниваются равными, должны иметь одно и то же значение хэш-функции.Hashability позволяет использовать объект как ключ словаря и член набора, поскольку эти структуры данных используют внутреннее значение хэша.
Все неиспользуемые встроенные объекты Pythons являются хешируемыми, в то время как нет изменяемых контейнеров (таких как списки или словари). Объекты, являющиеся экземплярами пользовательских классов, по умолчанию хешируются; все они сравниваются неравномерно, а их хеш-значение - их
id()
.
Все ответы здесь содержат хорошее рабочее объяснение хешируемых объектов в python, но я считаю, что нужно сначала понимать термин Хейшинг.
Хеширование - это концепция в информатике, которая используется для создания высокопроизводительных структур псевдослучайного доступа, где необходимо хранить и получать большой объем данных.
Например, если у вас есть 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
Смотрите документацию hashable и __hash__()
метод.
В моем понимании в соответствии с глоссарием Python, когда вы создаете экземпляр объектов, хешируемых, неизменное значение также вычисляется в соответствии с членами или значениями экземпляра. Например, это значение затем можно использовать в качестве ключа в dict, как показано ниже:
>>> 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(a) == id(c) # a and c same object?
False
>>> a.__hash__() == c.__hash__() # a and c same value?
True
>>> dict_a = {}
>>> dict_a[tuple_a] = 'hiahia'
>>> dict_a[tuple_c]
'hiahia'
мы можем найти, что хэш-значение tuple_a и tuple_c одинаково, поскольку они имеют одинаковые элементы. Когда мы используем tuple_a в качестве ключа в dict_a, мы можем обнаружить, что значение для dict_a [tuple_c] одинаков, а это значит, что, когда они используются как ключ в dict, они возвращают одно и то же значение, поскольку значения хэша тоже самое. Для тех объектов, которые не хешируются, метод хеш определяется как None:
>>> type(dict.__hash__)
<class 'NoneType'>
Я предполагаю, что это значение хэша вычисляется при инициализации экземпляра, а не динамическим способом, поэтому только неизменяемые объекты хешируются. Надеюсь, это поможет.
В python это означает, что объект может быть членом множеств, чтобы вернуть индекс. То есть они имеют уникальный идентификатор /id.
например, в python 3.3:
Списки структуры данных не являются хешируемыми, но структура данных Кортежи являются хешируемыми.
Позвольте мне привести рабочий пример для понимания хешируемых объектов в python. Я беру 2 Tuples для этого примера. Каждое значение в кортеже имеет уникальное значение хеша, которое никогда не изменяется в течение его жизни. Поэтому, основываясь на этом, имеет значение, выполняется сравнение между двумя кортежами. Мы можем получить хэш-значение элемента кортежа, используя Id().