一尘不染

python的“设置”稳定吗?

python

当我在python集上进行多次迭代(在调用之间不进行更改)时,是否可以假定它总是以相同顺序返回元素?如果不是,更改订单的理由是什么?它是确定性的还是随机的?还是实现定义?

当我重复调用相同的python程序(不是随机的,不是依赖于输入的)时,我会得到相同的集合排序吗?

潜在的问题是python集迭代顺序是否仅取决于用于实现集的算法,还是取决于执行上下文?


阅读 140

收藏
2020-12-20

共1个答案

一尘不染

没有正式的关于集合稳定性的保证。但是,在CPython实现中,只要不更改集合,项目将以相同顺序生成。集被实现为开放式地址哈希表(使用质数探针),因此插入或删除项目可以完全改变顺序(特别是在触发调整大小时,可以重新排列项目在内存中的布局。)有两个相同的集合,但是它们以不同的顺序生成项目,例如:

>>> s1 = {-1, -2}
>>> s2 = {-2, -1}
>>> s1 == s2
True
>>> list(s1), list(s2)
([-1, -2], [-2, -1])

除非您非常确定自己拥有相同的集合,并且在两次迭代之间没有碰触到它,否则最好不要依赖于它保持不变。例如,对您之间调用的函数进行看似无关的更改可能会导致很难发现错误。

2020-12-20