Sobes.tech
Назад к вопросам
Junior — Middle
65

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

Компании, где спрашивали
IT OneIT One

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Неизменяемость и хэширование — это разные свойства, хотя часто идут вместе. Неизменяемый объект нельзя изменить после создания, поэтому его хэш не “ломается” со временем. Хэшируемый объект можно использовать как ключ в словаре или элемент множества, если его хэш стабилен на весь срок жизни объекта.

Определение:

Неизменяемый тип данных — это тип, у которого после создания нельзя поменять внутреннее состояние: любое “изменение” создаёт новый объект.
Хэшируемый тип — это тип, для которого можно вычислить хэш и использовать его в структурах данных на основе хэша, например в dict и set.

Связь между ними такая: неизменяемость обычно помогает сделать объект хэшируемым, но это не одно и то же. Хэшируемость зависит от того, что объект можно однозначно сравнивать и его значение не меняется так, чтобы хэш становился неверным.

Пример использования:

Строки, числа и кортежи с неизменяемыми элементами обычно подходят для словаря как ключи.
Списки, наоборот, изменяемые, поэтому их нельзя использовать как ключи, даже если они содержат “похожие” данные.

# неизменяемый и хэшируемый объект
key1 = ("qa", 2024)
d = {key1: "test data"}

# изменяемый объект
key2 = ["qa", 2024]
# d[key2] = "test data"  # TypeError: unhashable type: 'list'

Пояснение кода:

key1 — это кортеж, его содержимое нельзя изменить, поэтому его хэш остаётся стабильным. Такой объект можно безопасно использовать как ключ словаря.
key2 — список, его элементы можно менять, например заменить один из них или добавить новый. Если бы список был ключом, после изменения его хэш мог бы стать другим, а структура словаря перестала бы корректно находить значение.

Шаги на примере:

  1. Создаётся кортеж ("qa", 2024).
  2. Он используется как ключ в словаре d.
  3. Создаётся список ["qa", 2024].
  4. Попытка использовать список как ключ приводит к ошибке, потому что список не хэшируемый.

Ключевые моменты:

  • Неизменяемость означает, что объект нельзя изменить после создания.
  • Хэшируемость означает, что объект можно использовать в dict и set.
  • Большинство неизменяемых типов хэшируемы, но это не абсолютное правило.
  • Изменяемые типы обычно не хэшируемы, потому что их значение может поменяться после помещения в хэш-структуру.
  • Для ключей словаря важны стабильный хэш и корректное сравнение на равенство.
  • В QA это важно при работе с коллекциями тестовых данных, кэшами, множествами уникальных значений и маппингом ожиданий.