Что означает `**` в выражении `dict (d1, ** d2)`?
Я заинтригован следующим выражением 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}
Ответы
Ответ 1
**
в списках аргументов имеет особое значение, как описано в разделе раздела 4.7 учебника. Словарный (или словарь-подобный) объект, переданный с помощью **kwargs
, разворачивается в аргументы ключевого слова вызываемому, так же как *args
разлагается на отдельные позиционные аргументы.
Ответ 2
** перевод словаря на ключевые слова:
>>> d1 = {'a': 1, 'b': 2}
>>> d2 = {'c': 3, 'd': 4}
>>> d3 = dict(d1, **d2)
становится:
>>> d3 = dict(d1, c=3, d=4)
Ответ 3
В 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
Ответ 4
Также стоит упомянуть механику конструктора dict. Он принимает начальный словарь в качестве первого аргумента и может также принимать аргументы ключевых слов, каждый из которых представляет новый член для добавления во вновь созданный словарь.
Ответ 5
Этот оператор используется для распаковки списка аргументов:
http://docs.python.org/tutorial/controlflow.html#unpacking-argument-lists
Ответ 6
у вас есть ответ оператора **. здесь другой способ добавить словари
>>> 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}