ChainMap提供了一种从逻辑上将不同的字典或者映射合并为一个单独的映射,而字典中自带的update方法也可以字典合并,通过比较这种不同的方法,可以在不同的场合选用不同的方法来进行映射的处理.
ChainMap:
1 | from collections import ChainMap |
1 | ChainMap({'x': 1, 'y': 2}, {'z': 3, 'w': 4, 'x': 5}) |
可以看到,合并后的字典中的值是与原始字典联系在一起的,原始字典改变合并后的字典也会同时变化,并且当两个原始字典中有重复的键时,ChainMap会默认现在第一个字典中的值,当然合并后的ChainMap对象支持所有的字典的操作.
update:
1 | a = {'x': 1, 'y': 2} |
1 | {'x': 5, 'y': 2, 'z': 3, 'w': 4} |
从上述代码可以看出,字典的update方法是在原始字典的基础上进行合并的,更准确的说,这应该是将一个字典按照另外一个字典进行更新,相同的键会更新为后一个字典中的值,并后一个字典在之后的进行更改后并不会影响合并后的字典.
总结
区别:
- ChainMap合并后的新字典键值对改变不会影响原字典,而update是在一个字典的基础的进行合并,破坏了原始字典.
- ChainMap产生的字典对象中的键值会随原始字典的变化而变化,update更新后的字典就是原始字典,与参考更新的字典没有任何关系.
- 遇到相同的键,ChainMap总是将第一个字典的这个键的值作为合并后字典的值,而update刚好相反,它会采用后一个字典的值