Кортежи в Python называют "хешируемыми" потому, что они могут быть использованы в качестве ключей в словарях (dict) и элементах множеств (set). Для того, чтобы тип данных мог быть использован в качестве ключа словаря или элемента множества, он должен быть
неизменяемым и
хешируемым.
Неизменяемость означает, что после создания кортежа его содержимое не может быть изменено. Попытка изменить элемент кортежа приведет к ошибке.
Хешируемость означает, что объект имеет хеш-значение, которое остается постоянным на протяжении всего времени жизни объекта. Хеш-значение - это целочисленное представление объекта, которое используется для быстрого поиска объекта в хеш-таблицах, которые лежат в основе словарей и множеств. В Python функция
hash()
возвращает хеш-значение объекта. Важно, чтобы у неизменяемого объекта всегда было одно и то же хеш-значение.
Поскольку кортежи неизменяемы и имеют стабильное хеш-значение, вычисленное на основе их содержимого, они удовлетворяют требованиям для использования в качестве ключей словарей и элементов множеств. В отличие от списков, которые изменяемы, списки не хешируются и не могут использоваться в этих контекстах. Изменение содержимого списка изменило бы его хеш-значение, что сделало бы его непригодным для использования в качестве ключа словаря или элемента множества, поскольку хеш-таблица не смогла бы правильно его найти.
Например:
my_tuple = (1, 2, 3)
my_dict = {my_tuple: "значение"} # Это работает
my_list = [1, 2, 3]
# my_dict = {my_list: "значение"} # Это вызовет TypeError: unhashable type: 'list'