2010-02-12 31 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

它也值得一提的字典構造函數的機制。它將初始字典作爲其第一個參數,並且還可以採用關鍵字參數,每個參數表示一個新成員以添加到新創建的字典中。

相關問題