流畅的Python_字典和集合

• Python 里的 dict 和 set 的效率有多高?

在一个有 1000 万个键的字典里查找 1000 个数,花在每个数上的时间不过是 0.337微秒

• 为什么它们是无序的?

键的次序取决于添加顺序,往字典里添加新键可能会改变已有键的顺序

• 为什么并不是所有的 Python 对象都可以当作 dict 的键或 set 里的元素?

 键必须是可散列的

(1) 支持 hash() 函数,并且通过 __hash__() 方法所得到的散列值是不变的。

(2) 支持通过 __eq__() 方法来检测相等性。

(3) 若 a == b 为真,则 hash(a) == hash(b) 也为真。

• 为什么 dict 的键和 set 元素的顺序是跟据它们被添加的次序而定的,以及为什么在映射对象的生命周期中,这个顺序并不是一成不变的?

当往 dict 里添加新键而又发生散列冲突的时候,新键可能会被安排存放到另一个位置

• 为什么不应该在迭代循环 dict 或是 set 的同时往里添加元素?

无论何时往字典里添加新的键,Python 解释器都可能做出为字典扩容的决定。扩容导致的结果就是要新建一个更大的散列表,并把字典里已有的元素添加到新表里。这个过程中可能会发生新的散列冲突,导致新散列表中键的次序变化。



你可能感兴趣的:(流畅的Python_字典和集合)