Python自引用列表在排序的

2024-04-26 10:11:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近在尝试使用.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))的输出让我困惑。想知道是不是某种形式的递归导致了它


Tags: 列表排序差异sort代码生成形式sortedprint
2条回答

我要给你的名单打电话x,因为坦率地说l看起来太像头号人物了,这让我很扫兴。所以你有一个列表x,看起来像这样

[x, x, x]

现在,我们知道了

print(x)

Python非常聪明,可以说“嘿,看,这个列表递归地包含它自己,我们不要再在它内部打印它了。”所有的位置x都出现在您的列表中,我们得到[...]

[[...], [...], [...]]

现在考虑

x.sort()
print(x)

我们对列表进行排序,因为每个元素都是相同的,所以没有什么作用。然而,至关重要的是,这一切都发生在适当的地方。列表开始时看起来像[x, x, x],结束时看起来像[x, x, x],其中x是我们的列表。所以指纹看起来是一样的

[[...], [...], [...]]

最后是你有趣的例子

sorted(x)

sortedlist.sort不同,修改列表,而是生成一个新的列表。让我们把这个新列表称为y。在您的x.sort示例中,最后,我们有一个类似x = [x, x, x]相同的列表x。当我们打印列表时,我们立即看到递归并停止打印

但是,sorted(x)生成一个新的列表。列表看起来仍然像[x, x, x],但它不是列表x。这是一个新的列表

现在,我们知道了

print(sorted(x))

Python看到了三个元素的列表:[x, x, x]。我们来看看这些元素中的每一个。我们正在打印y,所以这个列表包含x的事实不是递归问题;这是一个包含其他列表的非常普通的列表。所以我们在y的内部打印x。现在,再往下一层,我们看看x的内部,看到它再次包含x。这是一个递归问题,但它发生在一个步骤之后,因为我们制作了一个新的列表,虽然它看起来与原始列表相同,但它是不同的

[[[...], [...], [...]], [[...], [...], [...]], [[...], [...], [...]]]

也许你认为在lst[0] = lst之后lst会是[[1,2,3],2,3]。如果是这样,您将假设 = lstpasses by value。但是列表是passed by reference,所以在这一点上lst[lst,2,3]

要按值传递,请使用lst[0] = list(lst)等。这一次,右侧创建了一个新列表,其值与前面相同,但是一个新引用,因为在此上下文中list(lst)syntactic sugar表示[v for v in lst]

正如@DeepSpace所指出的,关于list的这一事实也解释了为什么print(list(lst))print(lst)详细三倍;它打印[v for v in lst],这只是[lst, lst, lst]

相关问题 更多 >