`dict(d1, **d2)` 表达式中的 `**` 是啥意思?

Posted

技术标签:

【中文标题】`dict(d1, **d2)` 表达式中的 `**` 是啥意思?【英文标题】:What does `**` mean in the expression `dict(d1, **d2)`?`dict(d1, **d2)` 表达式中的 `**` 是什么意思? 【发布时间】:2011-01-16 09:16:26 【问题描述】:

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

d3 = dict(d1, **d2)

任务是将两个字典合并为第三个,上面的表达式完成了任务。我对 ** 运算符以及它对表达式的作用感兴趣。我以为 ** 是幂运算符,还没有看到它在上面的上下文中使用过。

完整的sn-p代码如下:

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

【问题讨论】:

需要注意的是,GvR认为这个表达式是despicable 这仅在d2 中的键是字符串时才有效,至少在 Python 3 中是这样。 哦,很酷,我完全没有意识到它可以在 Python 2 中工作。我想这是 dict(d1, **d2) 优于 dict(**d1, **d2)d1, **d2**d1, **d2 的优势——它可以工作在 Python 2 中。我认为最后一个是 Python 3 中的首选语法,因为它简洁且一致。但是很高兴知道在 Python 2 中有一种方法可以做到这一点,至少使用字符串键,即使它看起来有点 hackish。 【参考方案1】:

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

接收方示例:

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

调用方示例(感谢 Thomas):

>>> mydict = dict(a=1,b=2,c=3)
>>> fn(**mydict)
a
c
b

【讨论】:

请注意,这显示的是接收方,而不是调用方。【参考方案2】:

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

【讨论】:

我的问题是,为什么使用dict(d1, **d2) 而不是dict(**d1, **d2)。后者对我来说看起来更干净,最终结果似乎是一样的。我错过了什么吗? 没关系;我没有意识到我们在谈论 Python 2,dict(d1, **d2) 似乎是唯一的方法。很高兴知道它甚至是可能的。不过,我认为**d1, **d2 是 Python 3 中的首选语法,因为它一致且简洁。【参考方案3】:

**把字典变成关键字参数:

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

变成:

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

【讨论】:

改为dict(d1, c=3, d=4) 好的,谢谢!我知道我要输入什么,但我的手指没有收到信息……【参考方案4】:

该运算符用于解包参数列表: http://docs.python.org/tutorial/controlflow.html#unpacking-argument-lists

【讨论】:

【参考方案5】:

你已经得到了 ** 运算符的答案。这是添加字典的另一种方法

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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于`dict(d1, **d2)` 表达式中的 `**` 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

python中如何判断一个dict是另一个dict的子集?

字典及datetime模块

Python标准库:内置函数dict(mapping, **kwarg)

字典常用操作

python学习历程第五天

java验证日期"yyyyMMdd"正则表达式,