当我在python集上进行多次迭代(在调用之间不进行更改)时,是否可以假定它总是以相同顺序返回元素?如果不是,更改订单的理由是什么?它是确定性的还是随机的?还是实现定义?
当我重复调用相同的python程序(不是随机的,不是依赖于输入的)时,我会得到相同的集合排序吗?
潜在的问题是python集迭代顺序是否仅取决于用于实现集的算法,还是取决于执行上下文?
没有正式的关于集合稳定性的保证。但是,在CPython实现中,只要不更改集合,项目将以相同顺序生成。集被实现为开放式地址哈希表(使用质数探针),因此插入或删除项目可以完全改变顺序(特别是在触发调整大小时,可以重新排列项目在内存中的布局。)有两个相同的集合,但是它们以不同的顺序生成项目,例如:
>>> s1 = {-1, -2} >>> s2 = {-2, -1} >>> s1 == s2 True >>> list(s1), list(s2) ([-1, -2], [-2, -1])
除非您非常确定自己拥有相同的集合,并且在两次迭代之间没有碰触到它,否则最好不要依赖于它保持不变。例如,对您之间调用的函数进行看似无关的更改可能会导致很难发现错误。