Ответ
Да, у словаря в Python есть несколько ключевых ограничений, которые важно учитывать при написании и тестировании кода:
-
Ключи должны быть хешируемыми (неизменяемыми типами). Это фундаментальное ограничение структуры данных. При попытке использовать нехешируемый ключ (например, список) возникает
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 # Ожидаемое поведение -
Отсутствие гарантированного порядка до Python 3.7. При тестировании кода, который должен работать на старых версиях Python (3.6 и ниже), нельзя полагаться на порядок элементов в словаре. Для проверки нужно использовать
assert dict1 == dict2, а не сравнение списков ключей или значений. -
Нет дубликатов ключей. При добавлении пары с существующим ключом старое значение перезаписывается. Это поведение нужно явно тестировать в сценариях обновления данных.
def test_dict_key_overwrite(): data = {'id': 1, 'status': 'old'} data['status'] = 'new' assert data == {'id': 1, 'status': 'new'} # Проверяем перезапись assert len(data) == 2 # Количество пар не увеличилось -
Производительность может деградировать. Средняя сложность операций (вставка, поиск) — O(1), но в худшем случае, при большом количестве коллизий хэшей, может достигать O(n). Это важно для нагрузочного тестирования при работе с очень большими словарями.
-
Высокое потребление памяти по сравнению со списками из-за overhead хэш-таблицы. Это может быть критично при тестировании в embedded-средах или при работе с огромными наборами данных в оперативной памяти.