Есть ли ограничения у словаря в Python

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

Ответ

Да, у словаря в Python есть несколько ключевых ограничений, которые важно учитывать при написании и тестировании кода:

  1. Ключи должны быть хешируемыми (неизменяемыми типами). Это фундаментальное ограничение структуры данных. При попытке использовать нехешируемый ключ (например, список) возникает TypeError: unhashable type. В тестах это нужно проверять.

    # Пример для тестирования валидных и невалидных ключей
    valid_keys = [1, 'key', (1, 2)]
    invalid_keys = [[1, 2], {'a': 1}, set([1,2])]
    
    for key in valid_keys:
        test_dict = {}
        test_dict[key] = 'value'  # Не должно вызывать ошибок
        assert test_dict[key] == 'value'
    
    for key in invalid_keys:
        try:
            test_dict = {key: 'value'}
            assert False, f"Key {key} should have raised TypeError"
        except TypeError:
            pass  # Ожидаемое поведение
  2. Отсутствие гарантированного порядка до Python 3.7. При тестировании кода, который должен работать на старых версиях Python (3.6 и ниже), нельзя полагаться на порядок элементов в словаре. Для проверки нужно использовать assert dict1 == dict2, а не сравнение списков ключей или значений.

  3. Нет дубликатов ключей. При добавлении пары с существующим ключом старое значение перезаписывается. Это поведение нужно явно тестировать в сценариях обновления данных.

    def test_dict_key_overwrite():
        data = {'id': 1, 'status': 'old'}
        data['status'] = 'new'
        assert data == {'id': 1, 'status': 'new'}  # Проверяем перезапись
        assert len(data) == 2  # Количество пар не увеличилось
  4. Производительность может деградировать. Средняя сложность операций (вставка, поиск) — O(1), но в худшем случае, при большом количестве коллизий хэшей, может достигать O(n). Это важно для нагрузочного тестирования при работе с очень большими словарями.

  5. Высокое потребление памяти по сравнению со списками из-за overhead хэш-таблицы. Это может быть критично при тестировании в embedded-средах или при работе с огромными наборами данных в оперативной памяти.