1. 键必须是可散列的。(dict的散列表中,每个键值对都占用一个表元,每个表元都有两个部分,一个是对键的引用,一个是对值得引用)
一个可散列的对象必须满足以下要求。(这也就是可变对象是不能作为字典中的键的原因的)
1). 支持hash函数,并且通过__hash__所得到的散列值是不变的
2). 支持通过__eq__方法检测相等性
3). 若a==b为真,则hash(a)==hash(b)为真
2. 字典在内存中的开销是巨大的(字典使用了散列表,而散列表又必须是稀疏的。Python会设法保证,大概三分之一的表元是空的,所以在快要到达这个阈值的时候,原有的散列表会复制到一个更大的空间里去)
3. 键查询很快(字典的实现是典型的以空间换时间,字典类型有着巨大的内存开销,但是它们提供了无视数据量大小的快速访问)
4. 键的次序取决于添加顺序(这是由于有的键发生冲突,那么发生冲突的键的顺序,就取决于添加顺序)
5. 往字典里添加新键可能会改变已有键的顺序(这个就是为什么不能遍历字典的时候,对字典进行添加或删除)
6. 字典的items(),keys(),values(),是字典的视图。可以理解为,当字典发生更改的时候,这三个方法在更改之前调用的时候返回的对象也会发生相应的更改。
d=dict([(1,2),(2,3)])
i=d.items()
print(i)#dict_items([(1, 2), (2, 3)])
d[3]=4
print(i)#dict_items([(1, 2), (2, 3), (3, 4)])
常用的哈希冲突解决的办法:
开放寻址法
分离链表法