Python3.6 之后字典是有序的?

  • Post category:Python

是的,从Python3.6开始,字典(dict)是有序的,其原因是为了增强语言的可预测性。在此之前,字典是无序的,每次遍历都可能产生不同的结果,可能会导致程序运行结果不一致,尤其在一些需要保证顺序的场景下会出现问题。

Python3.6之后,字典的有序性是通过一种叫做“双端链表”的数据结构来实现的。具体来说,在字典插入新键值对时,新的键值对会被置于哈希表的末尾,并在“内部”链表上维护该键值对的顺序。这使得在遍历字典时,字典中的元素的顺序与插入顺序一致。另外,字典的有序性和性能并没有矛盾,通过哈希表的特性,查询、增加、删除操作的时间复杂度仍然是O(1)。

下面是两个示例说明:

示例1:

# 创建一个空字典
d = {}

# 向字典中添加三个键值对
d["a"] = 1
d["b"] = 2
d["c"] = 3

# 打印出字典中的键值对,观察顺序
print(d) # 输出:{'a': 1, 'b': 2, 'c': 3}

# 遍历字典,观察顺序
for k, v in d.items():
    print(k, v) # 输出:a 1, b 2,c 3

示例2:

# 创建一个字典,其中键值对的顺序与插入顺序相反
d = {"c": 3, "b": 2, "a": 1}

# 打印出字典中的键值对,观察顺序
print(d) # 输出:{'c': 3, 'b': 2, 'a': 1}

# 遍历字典,观察顺序
for k, v in d.items():
    print(k, v) # 输出:c 3,b 2,a 1

从上述示例可以看出,字典在Python3.6之后返回的顺序是有序的,并且该顺序始终与插入顺序一致,在遍历字典时也是如此。这一改变不仅提高了Python代码的可读性,也使代码更加健壮、易于调试。