66

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}
Mechanical snail
  • 29,755
  • 14
  • 88
  • 113
λ Jonas Gorauskas
  • 6,121
  • 6
  • 45
  • 66
  • 6
    It should be noted that GvR thinks this expression is [despicable](http://mail.python.org/pipermail/python-dev/2010-April/099459.html) – elhefe Aug 24 '12 at 18:19
  • 1
    This only works if the keys in `d2` are strings, at least in Python 3. – Brent Bradburn Aug 17 '13 at 23:00
  • Oh, cool, I didn't realise it would work at all in Python 2. I suppose that's the advantage of `dict(d1, **d2)` over `dict(**d1, **d2)` or `{d1, **d2}` or `{**d1, **d2}`—it works in Python 2. I think that last one is the preferred syntax in Python 3, because it's concise and consistent. But it's nice to know there's a way to do it in Python 2, at least with string keys, even if it does look a bit hackish. – Michael Scheper Jun 13 '17 at 17:58

6 Answers6

51

** 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.

Thomas Wouters
  • 130,178
  • 23
  • 148
  • 122
  • My question is, why use `dict(d1, **d2)` and not `dict(**d1, **d2)`. The latter looks cleaner to me, and the end result seems to be the same. Am I missing something? – Michael Scheper Jun 13 '17 at 17:53
  • Never mind; I didn't realise we were talking about Python 2, where `dict(d1, **d2)` seems to be the only way. Nice to know it's even possible. I think `{**d1, **d2}` is the preferred syntax in Python 3, though, since it's consistent and concise. – Michael Scheper Jun 13 '17 at 18:00
17

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)
Mark Byers
  • 811,555
  • 193
  • 1,581
  • 1,452
11

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
mechanical_meat
  • 163,903
  • 24
  • 228
  • 223
3

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.

mantrapeze
  • 51
  • 3
2

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}
ghostdog74
  • 327,991
  • 56
  • 259
  • 343
1

That operator is used to unpack argument list: http://docs.python.org/tutorial/controlflow.html#unpacking-argument-lists

Sridhar Iyer
  • 2,772
  • 1
  • 21
  • 28