Можно ли использовать изменяемый список (list) в качестве ключа словаря (dict) в Python?

«Можно ли использовать изменяемый список (list) в качестве ключа словаря (dict) в Python?» — вопрос из категории Python, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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

Пример ошибки:

my_dict = {}
try:
    my_dict[[1, 2, 3]] = "value"  # Попытка использовать список как ключ
except TypeError as e:
    print(e)  # Вывод: unhashable type: 'list'

Обходные пути и решения для QA-сценариев:

  1. Использовать кортеж (tuple): Если порядок элементов важен и элементы сами хешируемы.

    # Вместо списка ["GET", "/api/users"] используем кортеж
    test_config = {("GET", "/api/users"): {"status": 200}, ("POST", "/api/users"): {"status": 201}}
    key = ("GET", "/api/users")
    print(test_config[key])  # {'status': 200}
  2. Использовать строковое представление (с осторожностью): Если нужна простая группировка.

    # Для хранения параметров теста, где список — это набор тэгов
    test_cases = {str(["smoke", "api"]): "Test API health endpoint", ...}
  3. Использовать frozenset: Если порядок не важен, а нужен набор уникальных хешируемых элементов.

    # Для хранения тестов по наборам тегов
    test_suites = {frozenset({"smoke", "regression"}): [test1, test2]}

Практический вывод для тестирования: При проектировании тестовых данных или конфигураций, где нужен составной ключ, следует сразу выбирать неизменяемые структуры (кортеж, frozenset) или их строковое представление.