Найти в Дзене

Python и C#. А словари такие разные. Часть 1

Оглавление

На одном телеграмм-канале, кстати не плохом, по первому впечатлению, был опрос - "Что будет выведено на экран" (код ниже, ну и аналогичный опрос).

Отвечаем и читаем дальше.

Python 3.10.0; Инициализация словаря.
Python 3.10.0; Инициализация словаря.

Ctrl+C, Ctrl+V в помощь.

Продолжим

Я же знаю, что в словарях хранятся только уникальные ключи, он же для этого и разрабатывался, чтобы время поиска равнялось О(1). И моим ответом был пункт номер два. Но не тут то было. Оказывается, пункт номер три. Протестировал код и в правду номер 3. Побродил по просторам рунета и в итоге решил проверить, а как аналогичный код поведет себя на C#.

Отвечаем и читаем дальше.

C# 5.0; Инициализация словаря.
C# 5.0; Инициализация словаря.

Ctrl+C, Ctrl+V в помощь.

Вроде бы и не удивительно

Здесь ответ под номером один, т.е. программа сыпется сразу.

А что не так?

Когда начинаешь изучать такую структуру данных, как словарь, то первое о чем твердится, про уникальность ключей и скорость поиска, ведь уникальность ключей и позволяет достичь этой скорости. А раз ключ уникален, то дубль - это ошибка.

Но для тех, кто программирует на Python, нужно учитывать тот факт, что наличие дубликата в словаре при инициализации, это не ошибка. Я, вот, про это не знал, да и не задумывался ни когда.

Осмелюсь предположить, что это связано с тем, что Python - это интерпретируемый язык, а С# - компилируемый.

Интерпретатор, перебирая элементы словаря при инициализации, не производит явное добавление: он проверяет наличие ключа в словаре и если таковой есть, то просто перезаписывает его новым значением, а если элемента словаря с таким ключом нет, то происходит добавление нового элемента в словарь.

А вот компилятор, произведя подобные действия, при обнаружении дубликата создает исключение - ArgumentException.

Начиная с С# 6.0, так же доступен еще один способ инициализации.

Отвечаем и читаем дальше.

C# 6.0; Инициализация словаря.
C# 6.0; Инициализация словаря.

Ctrl+C, Ctrl+V в помощь.

Во дела

А вот здесь поведение аналогично поведению интерпретатора Python.

C# 6.0 и Python 3.10.0; Инициализация словаря.
C# 6.0 и Python 3.10.0; Инициализация словаря.

Данные обстоятельства навели меня на мысль - проверить, а что произойдет при добавлении дубликата в словарь. Об этом во второй части.

Вывод

Из примеров видно, что в Python, наличие дубликата в словаре при инициализации ни как не скажется на запуске программы. Но это может вылиться в ошибку, в другом месте программы, где этот ключ используется, будет извлекаться не верное значение. Этот момент надо учитывать при ручном формировании словаря или загрузке его из вне.

А вот в C# есть два способа инициализации словаря, один аналогичен способу Python, а другой не позволит проинициализировать дубликаты, но тогда это скажется на работе всей программы. И это нужно как-то обрабатывать.

Спасибо за потраченное время на прочтение.

Строго не судите.

За уместные комментарии буду признателен.