首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘d3 = {**d1,**d2}’和‘d4= dict(**d1,**d2)’之间的差异?

‘d3 = {**d1,**d2}’和‘d4= dict(**d1,**d2)’之间的差异?
EN

Stack Overflow用户
提问于 2019-10-16 07:18:17
回答 3查看 357关注 0票数 2

假设有两个二分法,其中一些键被钝化了。然后将两者结合起来,用d2键代替d1。

代码语言:javascript
复制
d1 = {
    "2222": {1:3},
    "3333":{1:5}
}

d2 = {
    "2222": {1:5},
    "4444":"a"
}


# expected output is
# {'2222': {1: 5}, '3333': {1: 5}, '4444': 'a'}

我试过

代码语言:javascript
复制
d3 = {**d1, **d2}  # works

d4 = dict(**d1, **d2)  # failed

TypeError: type object got multiple values for keyword argument '2222'

我不明白为什么d3 = {**d1, **d2}有效,但d4 = dict(**d1, **d2)失败了,**在这两个表达式中意味着什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-16 07:24:17

他们做的事情略有不同。

第一种类似于写作。

代码语言:javascript
复制
d3 = {"2222": {1:3}, "3333":{1:5}, "2222": {1:5}, "4444":"a"}

在这里你用一个重复的键来定义一个字典。这是允许的(但可能不是个好主意)。字典将使用为重复键提供的最后一个值。

第二种类似于写作。

代码语言:javascript
复制
d4 = dict("2222"={1:3}, "3333"={1:5}, "2222"={1:5}, "4444"="a")

这里调用dict传递关键字,并且一个关键字被重复两次。这在语言层面是被禁止的。(尝试使用"2222"作为关键字参数通常也是被禁止的,但它与**表示法一起工作。对于允许这样做是否是个好主意,意见不一。)

票数 12
EN

Stack Overflow用户

发布于 2019-10-16 07:42:45

  • python中的**符号,称为kwarg (用于关键字参数),意味着参数是dictionary
  • d3 = {**d1, **d2}是python中合并字典的一个“技巧”。
  • dict()是创建字典的内置方法,其构造函数的唯一可能形式是:

dict(**kwarg) dict(映射,**kwarg) dict(可迭代,**kwarg)

  • d3 = dict(**d1, **d2)不可能与d3 = dict(d1, d2)不一样。

最后,答案在dict()方法构造函数中。

票数 0
EN

Stack Overflow用户

发布于 2019-10-16 10:11:05

**是用于字典的Python解压缩操作符。

它接受字典中所有的键值对(或关键字参数的缩写),并返回函数参数(键值对)。

当您在花括号中解压两个字典d1和d2:{}时,它们会在字典结构中解压。

根据Python的官方文档

字典中的,以后相同键的值总是会覆盖以前的键值,换句话说,d1和d2是浅合并的。

  • 所以,当你跑的时候: d3 = {**d1,**d2}

你得到的结果是:

代码语言:javascript
复制
{'2222': {1: 5}, '3333': {1: 5}, '4444': 'a'}
  • 如果你试过: d3 = {**d2,**d1}

你得到的结果是:

代码语言:javascript
复制
{'2222': {1: 3}, '3333': {1: 5}, '4444': 'a'}

最近的价值占主导地位。

溶液

对于如何处理字典的解压缩,dict()函数有许多内部细微差别。

代码语言:javascript
复制
dict(**d1, **d2) 

将尝试覆盖嵌套字典而不是合并它们,因此,在构造字典时,TypeError会尝试将多个值映射到相同的键。

相反,使用:

代码语言:javascript
复制
dict(d1, **d2)

应该解决您的问题,因为它将第二个dict作为关键字参数传递给构造函数,而不是解压所有参数,并试图通过覆盖嵌套的键值对来构造字典。

如果希望保留d1中的值,则可以使用:

代码语言:javascript
复制
dict(d2, **d1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58407788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档