What does `**` mean in the expression `dict(d1, **d2)`?

PythonSyntaxDictionaryOperatorsSet Operations

Python Problem Overview


I am intrigued by the following python expression:

d3 = dict(d1, **d2)

The task is to merge 2 dictionaries into a third one, and the above expression accomplishes the task just fine. I am interested in the ** operator and what exactly is it doing to the expression. I thought that ** was the power operator and haven't seen it used in the context above yet.

The full snippet of code is this:

>>> d1 = {'a': 1, 'b': 2}
>>> d2 = {'c': 3, 'd': 4}
>>> d3 = dict(d1, **d2)
>>> print d3
{'a': 1, 'c': 3, 'b': 2, 'd': 4}

Python Solutions


Solution 1 - Python

** in argument lists has a special meaning, as covered in section 4.7 of the tutorial. The dictionary (or dictionary-like) object passed with **kwargs is expanded into keyword arguments to the callable, much like *args is expanded into separate positional arguments.

Solution 2 - Python

The ** turns the dictionary into keyword parameters:

>>> d1 = {'a': 1, 'b': 2}
>>> d2 = {'c': 3, 'd': 4}
>>> d3 = dict(d1, **d2)

Becomes:

>>> d3 = dict(d1, c=3, d=4)

Solution 3 - Python

In Python, any function can accept multiple arguments with *;
or multiple keyword arguments with **.

Receiving-side example:

>>> def fn(**kwargs):
...   for kwarg in kwargs:
...     print kwarg
... 
>>> fn(a=1,b=2,c=3)
a
c
b

Calling-side example (thanks Thomas):

>>> mydict = dict(a=1,b=2,c=3)
>>> fn(**mydict)
a
c
b

Solution 4 - Python

It's also worth mentioning the mechanics of the dict constructor. It takes an initial dictionary as its first argument and can also take keyword arguments, each representing a new member to add to the newly created dictionary.

Solution 5 - Python

you have got your answer of the ** operator. here's another way to add dictionaries

>>> d1 = {'a': 1, 'b': 2}
>>> d2 = {'c': 3, 'd': 4}
>>> d3=d1.copy()
>>> d3.update(d2)
>>> d3
{'a': 1, 'c': 3, 'b': 2, 'd': 4}

Solution 6 - Python

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionλ Jonas GorauskasView Question on Stackoverflow
Solution 1 - PythonThomas WoutersView Answer on Stackoverflow
Solution 2 - PythonMark ByersView Answer on Stackoverflow
Solution 3 - Pythonmechanical_meatView Answer on Stackoverflow
Solution 4 - PythonmantrapezeView Answer on Stackoverflow
Solution 5 - Pythonghostdog74View Answer on Stackoverflow
Solution 6 - PythonSridhar IyerView Answer on Stackoverflow