Python 自引用列表在排序时产生奇怪的输出

标签 python list

我最近在尝试使用 .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/

相关文章:

python - 同步 AMQP 发布

python - 独立 Django ORM - 无法识别默认设置

python - Python 函数中的缩进和注释

python - Python 分隔连续字符串

python - 通过减去 pandas 列表中的两列来返回新列

python - 如何将整列附加到 python 中的表(列表列表)?

python - 如何解决python中的azure devop api对象移动结果

python - 删除列表中的子字符串,复杂度优于 O(n^2)

python - 在 Python 中使用冒号对列表进行切片时,是否可以使用大于列表长度的停止大小?

c# - 将 List<x> 转换为 List<y>