当前位置: 首页 > 知识库问答 >
问题:

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

颜举
2023-03-14

最近,我在尝试使用.sort()sorted()对自引用列表进行排序时遇到了一个奇怪的差异。我希望有人能弄清楚这件事。有关守则如下:

lst = [1, 2, 3]

lst[0] = lst
lst[1] = lst
lst[2] = lst

print(lst)

print(sorted(lst))

lst.sort()

print(lst)
[[...], [...], [...]]
[[[...], [...], [...]], [[...], [...], [...]], [[...], [...], [...]]]
[[...], [...], [...]]

共有1个答案

吴开宇
2023-03-14

我将把您的列表称为X,因为坦率地说,L看起来太像第一名了,让我很不舒服。因此,您得到了一个x列表,如下所示

[x, x, x]

现在,我们有

print(x)

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

[[...], [...], [...]]
x.sort()
print(x)
[[...], [...], [...]]

最后,你有趣的例子。

sorted(x)

list.sort不同,sorted不修改列表,而是生成一个新列表。让我们将这个新列表称为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不是递归问题;这是一个包含其他列表的非常普通的列表。因此,我们在Y中打印X。现在,再往下一层,我们查看X内部,看到它再次包含X。这是一个递归问题,但它发生在一步之后,因为我们创建了一个新列表,尽管它看起来与原始列表相同,但它是不同的。

[[[...], [...], [...]], [[...], [...], [...]], [[...], [...], [...]]]
 类似资料:
  • 问题内容: 每当我在控制台中输入错误或出错时,都会出现以下消息: 我同时使用Anaconda安装了Python 2.7和3.3。我想知道这是否正常还是python 2.7和3.3之间存在冲突 问题答案: 假设您使用的是ubuntu,这是相关的错误报告https://bugs.launchpad.net/ubuntu/+source/python3.3/+bug/1192890 您需要修补/etc/

  • 问题内容: 我不了解python中列表的行为: 为什么一个元素的分配影响另一个元素?感谢您的回答! 问题答案: 当您将一个列表相乘时,它会复制对该列表的引用,但不会创建该列表的副本。由于列表是可变的,因此在更改列表时,所有对其引用的引用都会更改。 用ASCII术语来说: 您可以清楚地看到更改list3将同时影响两个位置。 如果要创建可变长列表而不复制引用,则应执行以下操作: 在这里,我们使用列表理

  • 问题内容: 鉴于此程序: Sun的(v 1.6.0_24)产生以下字节码: 带有以下异常表: 我的问题是: 为什么到底在异常表中包括了最后一个条目? 据我了解,它基本上说“ 如果引发异常,请捕获它,然后重试相同的指令 ”。 即使使用空try / catch / finally子句(例如 一些观察 Eclipse编译器不会产生任何此类异常表条目 JVM规范没有记录该指令的任何运行时异常。 我知道JV

  • 我有一个列表我想按升序排序这个列表,但首先是奇数,然后是偶数,就像这样: 无排序功能 我试过这个但我得到一个错误 谢谢你的回应

  • 我刚刚键入,我得到了这个错误: 我没有找到任何关于任何有相同错误的人的参考,

  • 这些数字是,这正是我所期望的。 我完全搞不懂这两个案子的情况。有人能解释清楚吗?