Что означает `**` в выражении `dict (d1, ** d2)`? - PullRequest
39 голосов
/ 13 февраля 2010

Я заинтригован следующим выражением python:

d3 = dict(d1, **d2)

Задача состоит в том, чтобы объединить 2 словаря в третий, и приведенное выше выражение прекрасно справляется с задачей. Меня интересует оператор ** и что именно он делает с выражением. Я думал, что ** был оператором питания и еще не видел, чтобы он использовался в контексте выше.

Полный фрагмент кода:

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

Ответы [ 6 ]

41 голосов
/ 13 февраля 2010

** в списках аргументов имеет особое значение, как описано в разделе 4.7 учебного пособия . Словарь (или подобный словарю) объект, переданный с **kwargs, расширяется в аргументы ключевого слова для вызываемого объекта, так же как *args расширяется в отдельные позиционные аргументы.

12 голосов
/ 13 февраля 2010

** превращает словарь в параметры ключевого слова:

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

становится:

>>> d3 = dict(d1, c=3, d=4)
9 голосов
/ 13 февраля 2010

В Python любая функция может принимать несколько аргументов с *;
или несколько аргументов ключевых слов с **.

Пример получающей стороны:

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

Пример вызывающей стороны (спасибо Томасу):

>>> mydict = dict(a=1,b=2,c=3)
>>> fn(**mydict)
a
c
b
3 голосов
/ 13 февраля 2010

Стоит также упомянуть механику конструктора dict. Он принимает начальный словарь в качестве первого аргумента и может также принимать аргументы ключевых слов, каждый из которых представляет нового члена для добавления во вновь созданный словарь.

1 голос
/ 13 февраля 2010

вы получили ответ от оператора **. вот еще один способ добавить словари

>>> 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}
1 голос
/ 13 февраля 2010

Этот оператор используется для распаковки списка аргументов: http://docs.python.org/tutorial/controlflow.html#unpacking-argument-lists

...