为什么 Python 词典没有按创建顺序存储?

Why are Python dictionaries NOT stored in the order they were created?

只是好奇胜过其他任何东西,但为什么像下面这样的字典的顺序与创建时的顺序不同?但是当我打印出 test 它 returns 从那时起相同的顺序...

test = {'one':'1', 'two':'2', 'three':'3', 'four':'4'}

并不是说我需要订购它们,而是我一直在想这里发生的事情。

我在此找到的唯一内容是引用自 this 文章:

Python 使用复杂的算法来确定键值对在字典中的存储位置。

但是这些 "complex algorithms" 是什么?为什么?

Python 需要能够快速访问 D[thing]

如果它按照接收到的顺序存储值,那么当您向它请求 D[thing] 时,它事先并不知道该值放在哪里。它必须找到键 thing 出现的位置,然后找到该值。由于它无法控制接收这些密钥的顺序,因此平均需要大约 N/2 步,其中 N 是它收到的密钥数。

但是如果它有一个函数(称为散列)可以将 thing 转换为内存中的某个位置,它可以快速获取 thing 并计算该值,然后签入该值记忆点。当然,它必须做更多的开销——检查 D[thing] 是否确实被定义,并检查那些你可能定义了 D[thing1]D[thing2] 的罕见情况,其中散列函数thing1thing2 碰巧是相同的(在这种情况下 "collision" 出现并且 python 必须找出一个新的地方来放置其中之一)。


因此,对于您的示例,您可能希望当您搜索 test['four'] 时,它只会转到存储的列表中的最后一个条目并显示 "aha, that's '4'." 但它不能只这样做.它怎么知道 four 对应于列表的最后一个条目。它可能以任何顺序出现,因此它必须创建一些其他数据结构,使其能够快速判断 four 是最后一个条目。这会花费很多开销。

可以让它按照输入的顺序输出内容,但这仍然需要额外的开销来跟踪输入的顺序。

出于好奇,如果你想要一个有序的字典,使用OrderedDict