Python字典的update方法无效
我有两个字典。
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}