Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: mutable, hashable, dictionary key, Python, hash

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

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

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

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

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

Изменяемость и хешируемость в Python

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

Изменяемые объекты, такие как списки или множества, не являются хешируемыми, потому что их содержимое может измениться, что приведет к изменению хеша. Однако пользовательский класс может быть изменяемым, но при этом хешируемым, если он определяет методы __hash__ и __eq__ таким образом, что хеш остается постоянным, несмотря на изменения в объекте.

Пример

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __hash__(self):
        return hash(self.name)  # хеш основан только на имени

    def __eq__(self, other):
        return self.name == other.name

p = Person("Alice", 30)
d = {p: "data"}
p.age = 31  # объект изменен, но хеш не изменился
print(d[p])  # выведет "data"

В этом примере хеш объекта Person основан только на атрибуте name, который не меняется. Изменение age не влияет на хеш, поэтому объект остается хешируемым и может использоваться как ключ словаря.

Вывод

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

  • Аватар

    Python Guru

    Sergey Filichkin

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Python

    Python

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

#mutable

#hashable

#dictionary key

#Python

#hash

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

  • Аватар

    Python Guru

    Sergey Filichkin

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