为什么python会像这样订购我的字典?

Why is python ordering my dictionary like so?

本问题已经有最佳答案,请猛点这里访问。

这是我的字典

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
propertyList = {
   "id":          "int",
   "name":        "char(40)",

   "team":        "int",
   "realOwner":   "int",

   "x":           "int",
   "y":           "int",

   "description": "char(255)",

   "port":        "bool",
   "secret":      "bool",
   "dead":        "bool",
   "nomadic":     "bool",

   "population":  "int",
   "slaves":      "int",
}

但是当我用"n"打印出来的时候,加入(mydict)我会得到这个

1
2
3
4
5
6
7
8
9
10
11
12
13
name
nomadic
dead
port
realOwner
secret
slaves
team
y
x
population
id
description

我知道字典是无序的,但每次都是一样的,我不知道为什么。


对于旧版本的Python,真正的问题应该是"为什么不呢?""-无序字典通常被实现为散列表,其中元素的顺序定义良好,但并不立即明显(用于说明这一点的python文档)。您的观察结果完全符合哈希表的规则:明显的任意性,但顺序不变。

此后,python更改了其dict实现以保留插入顺序,从python 3.7开始就可以保证这一点。因此,实现不再构成纯哈希表(但哈希表仍在其实现中使用)。


内置字典类型的规范不维护秩序,最好把字典看作是一组无序的key: value对…

您可能需要检查OrderedDict模块,该模块是一个具有键插入顺序的有序字典的实现。


关于字典排序,您唯一可以依赖的是,如果没有对字典进行修改,则顺序将保持不变;例如,在不修改字典的情况下对字典进行两次迭代,将导致相同的键序列。但是,尽管python字典的顺序是确定的,但它可能会受到诸如插入和删除顺序等因素的影响,因此相同的字典最终可能以不同的顺序结束:

1
2
3
4
>>> {1: 0, 2: 0}, {2: 0, 1: 0}
({1: 0, 2: 0}, {1: 0, 2: 0})
>>> {1: 0, 9: 0}, {9: 0, 1: 0}
({1: 0, 9: 0}, {9: 0, 1: 0})