Отличия ** от | в словарях Python

есть такой код:

first = {'a': 1, 'b': 2}
second = {'c': 3}

Нужно собрать два словаря в один результирующий. Обычно я делал это через **:

result = {**first, **second} 

Но недавно наткнулся на такой вариант

result = first | second

Понимаю, что это оператор для объединения. Но какая разница между ними? Что в одном случае id меняется, что в другом. Подскажите, может, есть ещё какие-то различия? Есть разница где что использовать?


Ответы (2 шт):

Автор решения: RottenRat

Начну с |. Это оператор слияния dict с dict и был придуман для того, чтобы решить проблему слияния двух списков

Грубо говоря, он просто создает новый словарь и добавляет 2 старых словаря, после чего возвращает новый словарь.

Просто и понятно. Рекомендую использовать его.

Для **dict ситуация другая. Грубо говоря, вы в конструктор просто передаете каждый элемент как (параметр = элемент), после чего заполняется dict и идет его возврат.

→ Ссылка
Автор решения: CrazyElf

До версии Python 3.9 для объединения словарей использовался способ {**first, **second}, а способа first | second просто не существовало.

В версии 3.9 был введён способ first | second - как простой, красивый и интуитивно понятный. В том числе по мнению самого Гвидо Ван Россума, который посчитал старый способ не красивым и не интуитивным. В то же время способ first | second кажется более естественным для людей, знакомых, например, с объединением множеств в Питоне или знакомых вообще со знаком | как с "побитовым или" в Питоне, да и в других языках. Выглядит такой способ просто (без излишних символов) и интуитивно понятно. Поэтому он был добавлен в язык и с версии 3.9 лучше пользоваться этим способом, хотя старый способ, конечно, тоже работает.

→ Ссылка