Отличия ** от | в словарях Python
есть такой код:
first = {'a': 1, 'b': 2}
second = {'c': 3}
Нужно собрать два словаря в один результирующий. Обычно я делал это через **:
result = {**first, **second}
Но недавно наткнулся на такой вариант
result = first | second
Понимаю, что это оператор для объединения. Но какая разница между ними?
Что в одном случае id меняется, что в другом. Подскажите, может, есть ещё какие-то различия? Есть разница где что использовать?
Ответы (2 шт):
Начну с |. Это оператор слияния dict с dict и был придуман для того, чтобы решить проблему слияния двух списков
Грубо говоря, он просто создает новый словарь и добавляет 2 старых словаря, после чего возвращает новый словарь.
Просто и понятно. Рекомендую использовать его.
Для **dict ситуация другая. Грубо говоря, вы в конструктор просто передаете каждый элемент как (параметр = элемент), после чего заполняется dict и идет его возврат.
До версии Python 3.9 для объединения словарей использовался способ {**first, **second}, а способа first | second просто не существовало.
В версии 3.9 был введён способ first | second - как простой, красивый и интуитивно понятный. В том числе по мнению самого Гвидо Ван Россума, который посчитал старый способ не красивым и не интуитивным. В то же время способ first | second кажется более естественным для людей, знакомых, например, с объединением множеств в Питоне или знакомых вообще со знаком | как с "побитовым или" в Питоне, да и в других языках. Выглядит такой способ просто (без излишних символов) и интуитивно понятно. Поэтому он был добавлен в язык и с версии 3.9 лучше пользоваться этим способом, хотя старый способ, конечно, тоже работает.