2010-02-12 84 views
31

我通过以下Python表达好奇:表达式`dict(d1,** d2)`中的`**`是什么意思?

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

需要注意的是,GvR认为这个表达式是[卑鄙的](http://mail.python.org/pipermail/python-dev/2010-April/099459.html) – elhefe 2012-08-24 18:19:35

+1

这只有在' d2'是字符串,至少在Python 3中。 – nobar 2013-08-17 23:00:02

+0

哦,很酷,我没有意识到它在Python 2中完全可以工作。我想这就是dict(d1,** d2)'over'dict ** d1,** d2)'或'{d1,** d2}'或'{** d1,** d2}''''''''在Python 2中有效。我认为最后一个是Python 3中的首选语法,因为它简洁而一致。但很高兴知道有一种方法可以在Python 2中实现,至少在字符串键中,即使它看起来有点冒失。 – 2017-06-13 17:58:22

回答

30

**位于参数列表中具有特殊的含义,如覆盖section 4.7 of the tutorial。与**kwargs一起传递的字典(或字典式)对象被扩展为可调用的关键字参数,很像*args被扩展为单独的位置参数。

+0

+1:参考教程。 – 2010-02-13 00:28:11

+0

我的问题是,为什么使用'dict(d1,** d2)'而不是'dict(** d1,** d2)'。后者看起来更清洁,最终的结果似乎是一样的。我错过了什么吗? – 2017-06-13 17:53:58

+0

没关系;我没有意识到我们正在谈论Python 2,其中'dict(d1,** d2)'似乎是唯一的方法。很高兴知道这甚至是可能的。不过,我认为'{** d1,** d2}'是Python 3中的首选语法,因为它是一致的和简洁的。 – 2017-06-13 18:00:55

9

在Python中,任何函数可以接受多个参数与*;
或多个keyword arguments与**。

接收端例如:

>>> 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 
+0

请注意,这表明接收方,而不是呼叫方。 – 2010-02-13 00:03:10

+0

再次感谢托马斯:-D增加了呼叫方的例子。 – bernie 2010-02-13 00:10:42

7

的**变成字典到关键字参数:

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

变为:

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

它变成了'dict(d1,c = 3,d = 4)'。 – 2010-02-13 00:03:31

+0

是的,谢谢!我知道我打字的意思,但我的手指没有得到消息...... – 2010-02-13 00:11:27

1

你有你的答案的**运营商。这是另一种添加字典的方法

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

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