← Назад к вопросам

Может ли список быть ключом словаря в Python?

1.0 Junior🔥 141 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Может ли список быть ключом словаря в Python?

Короткий ответ: Нет, список не может быть ключом словаря. Списки в Python несут значения, которые изменяемы (mutable), а ключи словаря должны быть неизменяемы (immutable). При попытке использовать список в качестве ключа вы получите ошибку TypeError.

Почему это важно?

Применение в качестве ключей требуется, чтобы они были хешируемы. Хеш-функция преобразует объект в целое число, которое используется для быстрого поиска значения в словаре. Если объект изменяется после добавления как ключ, его хеш может измениться, что нарушит целостность словаря и сделает поиск невозможным.

Пример ошибки

my_dict = {[1, 2, 3]: "value"}
# TypeError: unhashable type: 'list'

Какие типы могут быть ключами?

В качестве ключей словаря можно использовать неизменяемые типы:

my_dict = {
    "string_key": "value1",
    42: "value2",
    (1, 2, 3): "value3",
    frozenset([1, 2]): "value4",
    None: "value5"
}

print(my_dict["string_key"])
print(my_dict[(1, 2, 3)])

Кортеж вместо списка

Если вам нужна последовательность как ключ, используйте кортеж (tuple):

data = {
    ("author", "title"): "Война и мир",
    ("year", "month"): (2025, 3),
}

print(data[("author", "title")])

Понимание хешируемости

Объект хешируем, если:

  1. Его хеш не меняется в течение жизни объекта
  2. У него реализован метод __hash__(), возвращающий целое число
  3. Если объект сравним (__eq__()), его хеш всегда одинаков для одинаковых объектов
print(hash("hello"))
print(hash((1, 2)))
print(hash([1, 2]))

Практический пример: кэширование

cache = {}

def get_user(user_id, city):
    key = (user_id, city)
    if key in cache:
        return cache[key]
    result = f"User {user_id} from {city}"
    cache[key] = result
    return result

print(get_user(1, "Moscow"))

Заключение

Списки не могут быть ключами словарей, потому что они изменяемы. Это фундаментальное свойство Python, которое защищает целостность словарей. Для похожих нужд используйте кортежи, которые являются неизменяемыми аналогами списков и полностью поддерживают роль ключей словаря.