python dict实现细节
我有一个关于python字典实现的问题 看起来python将维护所有键的搜索顺序,例如 如果执行以下操作python dict实现细节,python,Python,我有一个关于python字典实现的问题 看起来python将维护所有键的搜索顺序,例如 如果执行以下操作 a = {} a[3] = 1 a[0] = 2 a = {0:2, 3:1} python将自动更改我的插入顺序。 由于python声称dict是无序集,我不太清楚 理解python为什么会保持这样的搜索顺序。 python是否通过哈希表实现dict并存储另一个dict 设置索引顺序 希望我能把问题说清楚 谢谢Dict索引排序只是Dict实现方式的结果,不应依赖 确切地说,Python
a = {}
a[3] = 1
a[0] = 2
a = {0:2, 3:1}
python将自动更改我的插入顺序。
由于python声称dict是无序集,我不太清楚
理解python为什么会保持这样的搜索顺序。
python是否通过哈希表实现dict并存储另一个dict
设置索引顺序
希望我能把问题说清楚
谢谢Dict索引排序只是Dict实现方式的结果,不应依赖 确切地说,Python不会更改插入顺序(因为插入顺序只是定义为将项目插入dict的顺序),但迭代顺序没有保证 当Python创建dict时,它为8个键、值对(我认为)创建了足够的空间。对于空的dict,没有一个被填满。每当您将一个项放入dict中时,Python都会对该键进行散列,并且该键的散列将决定索引的内容
如果您确实希望迭代顺序与插入顺序相同,请检查一个。dict的顺序完全由对象的哈希函数决定(如果存在哈希冲突,则插入顺序)。整数散列到自身(至少达到
sys.maxint
):
(C)python实现获取对象的哈希值,并使用一些位来确定表中的索引。它需要多少位取决于字典的长度。默认情况下,dict有8个可用插槽,因此数字0
和8
将发生冲突。我们可以这样看:
>>> d1 = {}
>>> d1[0] = 'foo'
>>> d1[8] = 'bar'
>>> d1
{0: 'foo', 8: 'bar'}
>>>
>>> d2 = {}
>>> d2[8] = 'bar'
>>> d2[0] = 'foo'
>>> d2
{8: 'bar', 0: 'foo'}
由于0
和8
在我们的词典中发生冲突,插入顺序似乎一直保持不变0
占用第一个可用插槽(毕竟,无论您从0
中获取多少位,您都会得到0
)<代码>8也尝试占用该插槽。但是,如果占用了该插槽,冲突解决将接管该插槽,python将在稍后的某个插槽中插入该值
当然,如果你的字典恰好有超过5个元素,它将被调整大小(我想是16个,但不要引用我的话),并且0
和8
将不再冲突
>>> d1 = {x:x for x in range(1, 6)}
>>> d1[0] = 0
>>> d1[8] = 8
>>> d1
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 8: 8}
>>> d2 = {x:x for x in range(1, 6)}
>>> d2[8] = 8
>>> d2[0] = 0
>>> d2
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 8: 8}
注意,(排序的)顺序是保留的(不是插入顺序),这意味着每个整数在哈希表中都得到了它的首选位置(没有冲突)。我认为dict在大约满2/3秒时会调整大小
注意,这纯粹是学术性的——python规范没有说这是它的工作方式,因此它可以随时更改。请不要依赖这种行为。大部分信息都可以从它旁边收集到…hmm..刚刚查看了您的个人资料。。你太年轻了,不能成为Fortran程序员;-)@我花了7年时间从事高性能计算和空间科学研究:-)小注:当你说“整数散列到自己”,这只适用于中等大小的整数。如果输入十几位左右的数字,它们就会散列为其他内容。@iCodez--
散列(12345678910112)
--我想只有当您超过sys.maxint
(在Cpython中)散列(-1)时,这种情况才会发生变化
是另一个例外不相关:我以重复的形式结束,因为您的具体问题应该由回答完全回答,尽管我意识到这些问题不符合100%。更多信息,请参见副本侧栏中的“链接问题”。
>>> d1 = {x:x for x in range(1, 6)}
>>> d1[0] = 0
>>> d1[8] = 8
>>> d1
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 8: 8}
>>> d2 = {x:x for x in range(1, 6)}
>>> d2[8] = 8
>>> d2[0] = 0
>>> d2
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 8: 8}