我认为原因很简单。list
s是有序的,dict
s(在Python 3.6 / 3.7之前)而set
s没有排序。因此,list
不建议您在迭代时修改s作为最佳实践,但这会导致 一致,可重现和有保证的 行为。
您可以使用它,例如,假设您想将list
偶数个元素拆分为一半,然后将第二个元素取反:
>>> lst = [0,1,2,3]
>>> lst2 = [lst.pop() for _ in lst]
>>> lst, lst2
([0, 1], [3, 2])
当然,执行此操作的方法更好,更直观,但要点是它可以工作。
相比之下,dict
s和set
s的行为完全是实现特定的,因为迭代顺序可能会根据哈希值而变化。
您会获得RunTimeError
与collections.OrderedDict
,大概是为了与dict
行为保持一致。我认为dict
在Python 3.6之后(dict
保证s保持插入顺序)后,行为不会发生任何变化,因为在没有实际用例的情况下它将破坏向后兼容性。
请注意,尽管已订购,在这种情况下collections.deque
也会引发a RuntimeError
。