dict类型是Python语言的基石,至关重要。Python对它做了高度优化,散列表是字典类型性能出众个跟本原因。
collection.abc 模块里面有Mapping和MutableMapping这两个抽象基类,他们的作用为dict和类似的类型提供形式接口。其他的映射类型,一般不会直接继承这两个抽象基类,会直接对dict就行扩展。
from collections import abc
print(isinstance({}, abc.Mapping))
print(isinstance({}, abc.MutableMapping))
打印 True True
Python标准库里面的映射类型都是用dict实现的,有个限制是映射里的键只能为可散列的数据类型,(值没有这个限制)。
什么是可散列?
如果一个对象是可散列的,那么在这个对象的生命周期中,他的散列值是不可变的,而且需要实现__hash__()方法,还有__eq__()方法用于键的比较。散列值就是对象hash()函数的返回值。
可散列类型包括:不可变数据类型str、bytes、数值型、frozenset(frozenset的定义就是只能容纳可散列类型)、还有元组(前提是其中的元素必须都是可散列的)
t1 = (1, 2, (3, 4))# 可散列的
print(hash(t1))
t2 = (1, 2, [3, 4])# 不可散列的
print(hash(t2))
打印 1229485614 Traceback (most recent call last): File "D:/PycharmProjects/hello/test2.py", line 12, in <module> print(hash(t2)) TypeError: unhashable type: 'list'