我最近在尝试使用 .sort()
对自引用列表进行排序时遇到了一个奇怪的差异。和 sorted()
.我希望有人能对此有所了解。有问题的代码如下:
lst = [1, 2, 3]
lst[0] = lst
lst[1] = lst
lst[2] = lst
print(lst)
print(sorted(lst))
lst.sort()
print(lst)
上面的代码产生以下输出:[[...], [...], [...]]
[[[...], [...], [...]], [[...], [...], [...]], [[...], [...], [...]]]
[[...], [...], [...]]
这是 print(sorted(lst))
的输出这让我感到困惑。想知道是否是某种形式的递归导致了它?
最佳答案
我要调用你的名单 x
,因为坦白l
看起来太像第一了,让我失望了。所以你有一个列表 x
看起来像这样
[x, x, x]
现在,我们做print(x)
Python 足够聪明,可以说“嘿,看,这个列表递归地包含自己,让我们不要在它自己内部再次打印它。”所有的地方x
出现在您的列表中,我们得到 [...]
[[...], [...], [...]]
现在考虑x.sort()
print(x)
我们对列表进行排序,这没什么用,因为每个元素都是相同的。然而,至关重要的是,这一切都发生在原地。该列表最初看起来像 [x, x, x]
并且最终看起来像 [x, x, x]
,其中 x
是我们的 list 。所以打印看起来是一样的。[[...], [...], [...]]
最后,你有趣的例子。sorted(x)
sorted
,不像 list.sort
, 不会修改列表而是生成一个新列表。让我们称这个新列表 y
.在您的 x.sort
例如,最后,我们有相同的列表 x
看起来像 x = [x, x, x]
.当我们打印列表时,我们立即看到递归并停止打印。然而,
sorted(x)
产生一个新列表。该列表仍然看起来像 [x, x, x]
,但它不是列表 x
.这是一个新列表y = [x, x, x]
.现在,我们做
print(sorted(x))
Python 看到一个包含三个元素的列表:[x, x, x]
.我们看看这些元素中的每一个。我们正在打印 y
,因此该列表包含 x
的事实不是递归问题;它是一个非常普通的列表,其中包含其他列表。所以我们打印 x
内部 y
.现在,再往下一层,我们看看内部 x
看到它包含,瞧,x
再次。这是一个递归问题,但它发生在一步之后,因为我们创建了一个新列表,尽管它看起来与原始列表相同,但又是不同的。[[[...], [...], [...]], [[...], [...], [...]], [[...], [...], [...]]]
关于Python 自引用列表在排序时产生奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68261721/