我最近在尝试使用.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
,看起来像这样现在,我们知道了
Python非常聪明,可以说“嘿,看,这个列表递归地包含它自己,我们不要再在它内部打印它了。”所有的位置
x
都出现在您的列表中,我们得到[...]
现在考虑
我们对列表进行排序,因为每个元素都是相同的,所以没有什么作用。然而,至关重要的是,这一切都发生在适当的地方。列表开始时看起来像
[x, x, x]
,结束时看起来像[x, x, x]
,其中x
是我们的列表。所以指纹看起来是一样的最后是你有趣的例子
sorted
与list.sort
不同,不修改列表,而是生成一个新的列表。让我们把这个新列表称为y
。在您的x.sort
示例中,最后,我们有一个类似x = [x, x, x]
的相同的列表x
。当我们打印列表时,我们立即看到递归并停止打印但是,
sorted(x)
生成一个新的列表。列表看起来仍然像[x, x, x]
,但它不是列表x
。这是一个新的列表现在,我们知道了
Python看到了三个元素的列表:
[x, x, x]
。我们来看看这些元素中的每一个。我们正在打印y
,所以这个列表包含x
的事实不是递归问题;这是一个包含其他列表的非常普通的列表。所以我们在y
的内部打印x
。现在,再往下一层,我们看看x
的内部,看到它再次包含x
。这是一个递归问题,但它发生在一个步骤之后,因为我们制作了一个新的列表,虽然它看起来与原始列表相同,但它是不同的也许你认为在
lst[0] = lst
之后lst
会是[[1,2,3],2,3]
。如果是这样,您将假设= lst
passes 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]
相关问题 更多 >
编程相关推荐