Проверяет понимание неизменяемости ключей словаря и последствий изменения атрибутов объектов, используемых в качестве ключей.
Словари в Python (и аналогичные структуры в других языках) используют хеш-таблицы для быстрого доступа к данным. Ключ словаря должен быть хешируемым, то есть иметь неизменяемый хеш на протяжении всего времени использования. Если вы измените атрибут объекта, который является ключом, его хеш-значение может измениться.
Когда вы вставляете элемент в словарь, Python вычисляет хеш ключа и помещает его в соответствующую корзину. При поиске ключа снова вычисляется хеш, и поиск идет в той же корзине. Если хеш изменился после вставки, поиск будет искать в другой корзине, и элемент не будет найден. Более того, старый хеш может остаться в структуре, что приведет к дублированию или потере данных.
class MutableKey:
def __init__(self, value):
self.value = value
def __hash__(self):
return hash(self.value)
def __eq__(self, other):
return self.value == other.value
obj = MutableKey(10)
d = {obj: "original"}
print(d[obj]) # "original"
obj.value = 20 # меняем атрибут
print(d.get(obj)) # None — ключ не найден
print(d) # словарь может выглядеть пустым или содержать "потерянный" элемент__slots__ или @dataclass(frozen=True)).Изменение атрибута объекта-ключа нарушает контракт хеш-таблицы, что приводит к непредсказуемому поведению. Всегда используйте неизменяемые объекты в качестве ключей словаря для надежности и предсказуемости кода.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
JavaScript
Python
Ключевые слова
Подпишись на Python Developer в телеграм