• 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 解释器都可能做出为字典扩容的决定。扩容导致的结果就是要新建一个更大的散列表,并把字典里已有的元素添加到新表里。这个过程中可能会发生新的散列冲突,导致新散列表中键的次序变化。