字典使用ChainMap与update的区别

ChainMap提供了一种从逻辑上将不同的字典或者映射合并为一个单独的映射,而字典中自带的update方法也可以字典合并,通过比较这种不同的方法,可以在不同的场合选用不同的方法来进行映射的处理.

ChainMap:

1
2
3
4
5
6
7
8
9
from collections import ChainMap
a = {'x': 1, 'y': 2}
b = {'z': 3, 'w': 4, 'x': 5}
c = ChainMap(a, b)
print(c)
a['x'] = 10
b['z'] = 10
print(c)
print(c['x'])
1
2
3
ChainMap({'x': 1, 'y': 2}, {'z': 3, 'w': 4, 'x': 5})
ChainMap({'x': 10, 'y': 2}, {'z': 10, 'w': 4, 'x': 5})
10

可以看到,合并后的字典中的值是与原始字典联系在一起的,原始字典改变合并后的字典也会同时变化,并且当两个原始字典中有重复的键时,ChainMap会默认现在第一个字典中的值,当然合并后的ChainMap对象支持所有的字典的操作.

update:

1
2
3
4
5
6
7
8
9
a = {'x': 1, 'y': 2}
b = {'z': 3, 'w': 4, 'x': 5}
c = a
c.update(b)
print(c)
a['y'] = 10
b['w'] = 10
print(c)
print(c['x'])
1
2
3
{'x': 5, 'y': 2, 'z': 3, 'w': 4}
{'x': 5, 'y': 10, 'z': 3, 'w': 4}
5

从上述代码可以看出,字典的update方法是在原始字典的基础上进行合并的,更准确的说,这应该是将一个字典按照另外一个字典进行更新,相同的键会更新为后一个字典中的值,并后一个字典在之后的进行更改后并不会影响合并后的字典.

总结

区别:

  1. ChainMap合并后的新字典键值对改变不会影响原字典,而update是在一个字典的基础的进行合并,破坏了原始字典.
  2. ChainMap产生的字典对象中的键值会随原始字典的变化而变化,update更新后的字典就是原始字典,与参考更新的字典没有任何关系.
  3. 遇到相同的键,ChainMap总是将第一个字典的这个键的值作为合并后字典的值,而update刚好相反,它会采用后一个字典的值