Какие есть ограничения на ключи в dict в Python?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Ключ в dict должен быть хешируемым и стабильным на протяжении жизни записи в словаре. Обычно это значит, что подходят неизменяемые типы вроде str, int, tuple из хешируемых элементов. Изменяемые объекты, такие как list, dict и set, ключами быть не могут.
Определение:
В Python ключ словаря используется для быстрого поиска значения по хешу, поэтому у ключа должен быть корректный __hash__() и согласованный __eq__(). Практически это означает, что объект должен быть хешируемым: его хеш не должен меняться, пока он используется как ключ.
Ограничения на ключи такие:
- ключ должен быть хешируемым;
- ключ должен поддерживать сравнение на равенство;
- если объект изменяемый, то обычно он не подходит, потому что изменение может сломать поиск по словарю.
Пример использования:
d = {
"name": "Alice",
42: "answer",
(1, 2): "tuple key"
}
print(d["name"])
print(d[42])
print(d[(1, 2)])
# Нельзя использовать list как ключ:
# bad = {[1, 2]: "value"} # TypeError: unhashable type: 'list'
Пояснение кода:
Код показывает три допустимых типа ключей: строку, число и кортеж. Строки и числа хешируемы, поэтому нормально работают в dict. Кортеж тоже подходит, если все его элементы сами хешируемы.
В закомментированной строке list используется как ключ, и это приведёт к ошибке TypeError, потому что список изменяемый и не имеет стабильного хеша.
Ключевые моменты:
- Ключ
dictдолжен быть хешируемым. - Обычно подходят неизменяемые типы:
str,int,float,tupleиз хешируемых элементов. list,dict,setи другие изменяемые объекты ключами быть не могут.- Если объект используется как ключ, его состояние не должно меняться так, чтобы менялся хеш.
- При нарушении этого правила словарь может перестать находить уже добавленный ключ.