Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: dictionary, hash, immutable, mutable object, hash collision

Что произойдет, если изменить атрибут объекта, который используется как ключ словаря?

Проверяет понимание неизменяемости ключей словаря и последствий изменения атрибутов объектов, используемых в качестве ключей.

Короткий ответ

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

Длинный ответ

Что происходит при изменении ключа словаря?

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

Почему это проблема?

Когда вы вставляете элемент в словарь, 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)).
  • Не изменяйте объект после того, как он стал ключом словаря.

Вывод

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

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • Python

    Python

Ключевые слова

#dictionary

#hash

#immutable

#mutable object

#hash collision

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.