Проверяет понимание изменяемости объектов и требований к хешируемости ключей словаря в 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__ на основе неизменяемых атрибутов. Однако на практике лучше избегать использования изменяемых объектов как ключей, чтобы не допустить ошибок.