字典算得上是 Python 的基石。除了基本的 dict 之外,标准库还提供现 成且好用的特殊映射类型,比如 defaultdict、OrderedDict、ChainMap 和 Counter。这些映射类型 都属于 collections 模块,这个模块还提供了便于扩展的 UserDict 类。
大多数映射类型都提供了两个很强大的方法:setdefault 和 update。setdefault 方法可以用来更新字典里存放的可变值(比如列 表),从而避免了重复的键搜索。update 方法则让批量更新成为可 能,它可以用来插入新值或者更新已有键值对,它的参数可以是包含 (key, value) 这种键值对的可迭代对象,或者关键字参数。映射类型 的构造方法也会利用 update 方法来让用户可以使用别的映射对象、可 迭代对象或者关键字参数来创建新对象。
在映射类型的 API 中,有个很好用的方法是 __missing__,当对象找 不到某个键的时候,可以通过这个方法自定义会发生什么。
collections.abc 模块提供了 Mapping 和 MutableMapping 这两个抽 象基类,利用它们,我们可以进行类型查询或者引用。不太为人所知的 MappingProxyType 可以用来创建不可变映射对象,它被封装在 types 模块中。另外还有 Set 和 MutableSet 这两个抽象基类。
dict 和 set 背后的散列表效率很高,对它的了解越深入,就越能理解 为什么被保存的元素会呈现出不同的顺序,以及已有的元素顺序会发生 变化的原因。同时,速度是以牺牲空间为代价而换来的。