Python字典的update方法无效

7 投票
3 回答
15489 浏览
提问于 2025-04-30 15:21

我有两个字典。

a = {"ab":3, "bd":4}
b = {"cd":3, "ed":5}` 

我想把它们合并成 {'bd': 4, 'ab': 3, 'ed': 5, 'cd': 3}

正如这个链接所说,a.update(b)可以完成这个操作。但是当我尝试的时候,我得到了:

type(a.update(b)) #--> type 'NoneType'

有没有人能告诉我为什么我不能得到一个字典类型?

我还试过这个,效果不错:

type(dict(a,**b)) #-->type 'dict'

这两种方法有什么区别,为什么第一种方法不行呢?

暂无标签

3 个回答

3

dict.update() 这个方法会返回 None,就像大多数会直接修改容器内容的方法一样,比如 list.append()list.sort()set.add() 等等。这是故意这样设计的,目的是为了让你不要误以为它会创建一个新的 dict(或者 list 等等)。

9

update 方法是用来直接修改一个字典的。它不会返回任何东西,和 list.extend 一样。如果你想查看更新后的结果,可以直接看看你修改过的字典。

>>> a = {"ab":3, "bd":4}
>>> b = {"cd":3, "ed":5}
>>> update_result = a.update(b)
>>> print(update_result)
None
>>> print(a)
{'ed': 5, 'ab': 3, 'bd': 4, 'cd': 3}

如果你想要的结果是一个新的、独立的字典,那就不要用 update。可以使用 dict(a, **b) 这样的方式,这样可以从两个部分创建一个新的字典,而不是去“更新”已有的字典。

3

作为一个新手Python用户,这个问题我经常遇到,总是忘记了。

正如你所猜的,a.update(b) 的结果是 None,就像 a.append(b) 对于列表来说也是返回 None。这些方法(比如 list.extend 也是)会直接在原来的数据结构上进行修改。

如果你其实不想改变 a,可以试试这个:

c = dict(a)  # copy a
c.update(b)  # update a using b
type(c)  #returns a dict

这样就可以了。

还有一种更简短的方法:

c = dict(a,**b)
type(c)  #returns a dict

这里发生的事情是 b 被“拆包”了。这个方法只有在 b 的所有键都是字符串时才有效,因为你实际上是在做这个:

c = dict(a, cd=3, ed=5)
type(c)  #returns a dict

注意,对于上面提到的任何方法,如果 a 中的键在 b 中重复了,b 的值会替换掉 a 的值,比如:

a = {"ab":3, "bd":4}
c = dict(a, ab=5)
c  #returns  {"ab":5, "bd":4}

撰写回答