Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python dict实现细节_Python - Fatal编程技术网

python dict实现细节

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

我有一个关于python字典实现的问题

看起来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}