省略[…]意思是在一个列表里?

我在玩python。我在IDLE中使用了以下代码:

p  = [1, 2]
p[1:1] = [p]
print p

输出结果是:

[1, [...], 2]

这个[…]是什么?有趣的是,我现在可以把它作为一个列表的列表的列表,直到无穷。

p[1][1][1]....

只要我愿意,我可以写上面的代码,而且它仍然有效。

编辑:

  • 它在内存中是如何表示的?
  • 它有什么用?举一些有用的例子会很有帮助。
  • 任何官方文件的链接都非常有用。
22126 次浏览

这意味着您创建了一个嵌套在自身内部的无限列表,它不能被打印。p包含p,它包含p…等等。[...]符号是让你知道这一点的一种方式,并告知它不能被表示!看看@6502的答案,看看发生了什么。

现在,关于你编辑后的三个新项目:

  • 这个回答似乎覆盖了它
  • Ignacio的链接描述了一些可能的用途
  • 这更像是一个数据结构设计的主题,而不是编程语言,所以在Python的官方文档中不太可能找到任何参考

对于“它有什么用”这个问题,这里有一个具体的例子。

图降低是一种计算策略,有时用于解释计算机语言。这是惰性求值的常用策略,尤其是在函数式语言中。

起点是建立一个表示程序将采取的“步骤”序列的图。根据程序中使用的控制结构,这可能会导致一个循环图(因为程序包含某种“永远”循环——或者使用递归,其“深度”在评价时已知,但在图形生成时不知道)……

为了表示这样的图,你需要无限“数据结构”(有时称为递归数据结构),就像你注意到的那样。通常情况下,会更复杂一些。

如果你对这个话题感兴趣,这里(在许多其他)有一个关于这个主题的讲座:
http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf

这是您的代码所创建的

enter image description here

它是一个列表,其中第一个和最后一个元素指向两个数字(1和2),而中间的元素指向列表本身。

在通用Lisp中,当启用打印圆形结构时,这样的对象将被打印为

#1=#(1 #1# 2)

这意味着有一个对象(用#1=标记为1)是一个有三个元素的向量,第二个是对象本身(用#1#反向引用)。

而在Python中,你只能通过[...]获得结构是循环的信息。

在这个特定的情况下,描述没有歧义(它向后指向一个列表,但只有一个列表,所以它必须是那个列表)。在其他情况下,可能是模糊的…例如在

[1, [2, [...], 3]]

反向引用可以指向外部列表,也可以指向内部列表。 使用

可以创建以相同方式打印的这两种不同结构
x = [1, [2, 3]]
x[1][1:1] = [x[1]]


y = [1, [2, 3]]
y[1][1:1] = [y]


print(x)
print(y)

他们会被铭记为

enter image description here

根据我的理解,这是一个不动点的例子

p  = [1, 2]
p[1:1] = [p]
f = lambda x:x[1]
f(p)==p
f(f(p))==p

在面向对象编程中,我们经常这样做。如果任何两个对象直接或间接地相互引用,它们都是无限递归结构(或者都是同一个无限递归结构的一部分,这取决于你如何看待它)。这就是为什么你在像列表这样原始的东西中看不到这么多——因为我们通常更适合将概念描述为相互连接的“对象”,而不是“无限列表”。

你也可以用无限递归字典得到...。假设你想要一个三角形角的字典,其中每个值都是与该角相连的其他角的字典。你可以这样设置:

a = {}
b = {}
c = {}
triangle = {"a": a, "b": b, "c": c}
a["b"] = b
a["c"] = c
b["a"] = a
b["c"] = c
c["a"] = a
c["b"] = b

现在如果你打印triangle(或abc),你会看到它充满了{...},因为任何两个角都是相互指向的。