Python 在表达“dict(d1,**d2)”时,`**`是什么意思?

Python 在表达“dict(d1,**d2)”时,`**`是什么意思?,python,syntax,dictionary,operators,set-operations,Python,Syntax,Dictionary,Operators,Set Operations,我对以下python表达式很感兴趣: d3 = dict(d1, **d2) 任务是将两个词典合并成第三个词典,上面的表达式可以很好地完成任务。我对**操作符感兴趣,它到底对表达式做了什么。我认为**是power操作符,还没有在上面的上下文中看到它的用法 完整的代码片段如下: >>> d1 = {'a': 1, 'b': 2} >>> d2 = {'c': 3, 'd': 4} >>> d3 = dict(d1, **d2) >>

我对以下python表达式很感兴趣:

d3 = dict(d1, **d2)
任务是将两个词典合并成第三个词典,上面的表达式可以很好地完成任务。我对**操作符感兴趣,它到底对表达式做了什么。我认为**是power操作符,还没有在上面的上下文中看到它的用法

完整的代码片段如下:

>>> 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中,任何函数都可以接受带*的多个参数
或带**的倍数

接收方示例:

>>> def fn(**kwargs):
...   for kwarg in kwargs:
...     print kwarg
... 
>>> fn(a=1,b=2,c=3)
a
c
b
呼叫方示例(感谢Thomas):


参数列表中的
**
具有特殊含义,如中所述。与
**kwargs
一起传递的dictionary(或类似dictionary的)对象被扩展为可调用的关键字参数,就像
*args
被扩展为单独的位置参数一样。

将dictionary转换为关键字参数:

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

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

该运算符用于解包参数列表:
您已经得到了**操作员的答案。这里有另一种添加词典的方法

>>> 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}

还值得一提的是dict构造函数的机制。它将初始字典作为第一个参数,也可以使用关键字参数,每个参数表示要添加到新创建的字典中的新成员。

注意,这显示的是接收方,而不是调用方。再次感谢Thomas:-D添加了调用方示例。改为
dict(d1,c=3,D=4)
。是的,谢谢!我知道我要键入什么,但我的手指没有得到消息……应该注意的是,GvR认为这个表达式是这样的,只有当
d2
中的键是字符串时,这才有效,至少在Python 3中是这样。哦,太酷了,我没有意识到它在Python 2中会起作用。我想这就是
dict(d1,**d2)
优于
dict(**d1,**d2)
{d1,**d2}
{**d1,**d2}
——它在Python 2中工作。我认为最后一个是Python3中首选的语法,因为它简洁且一致。但很高兴知道在Python2中有一种方法可以做到这一点,至少是使用字符串键,即使它看起来有点粗糙。我的问题是,为什么要使用
dict(d1,**d2)
而不是
dict(**d1,**d2)
。在我看来,后者更干净,最终结果似乎是一样的。我错过了什么吗?没关系;我不知道我们在谈论Python2,在这里,
dict(d1,**d2)
似乎是唯一的方法。很高兴知道这是可能的。不过,我认为
{**d1,**d2}
是Python 3中的首选语法,因为它是一致且简洁的。
>>> 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}