无论列表中的内容是什么,元素的__lt__方法都是唯一参考的比较方法.对于集合,a < b意味着" a是一个适当的子集b",这不足以定义总订单.这就是为什么结果通常是未定义的.它可以是原始列表的任何排列,与实现恰好适用__lt__于哪些列表元素对.
如果对于列表中的每对集合,其中一个实际上是另一对的适当子集,则列表将从最小(基数)集合排序到最大.否则很少可以说.例如:
>>> sorted([{5, 6}, {3, 4}, {5}, {3}]) # nothing changes
[{5, 6}, {3, 4}, {5}, {3}]
Run Code Online (Sandbox Code Playgroud)
发生的是未定义的实现细节的结果.自从我写完以来list.sort(),我知道在这种情况下会发生什么,但不能保证总是以这种方式工作:
首先,实现问"是{3, 4} < {5, 6}吗?".不,所以前两个元素的顺序与已经排序一致.它接下来问"是{5} < {3, 4}吗?".不,所以前三个元素似乎已经排序了.最后它问"是{3} < {5}吗?".再也没有了,所以原始列表的整个订单与已经排序的一致,没有任何变化.
未来的实施可能会例如问"是{5} < {5, 6}吗?" 在某些时候,因为"是"决定{5}需要出现之前{5, 6}.所以结果根本没有定义.