我在玩python。我在IDLE中使用了以下代码:
p = [1, 2]
p[1:1] = [p]
print p
输出结果是:
[1, [...], 2]
这是什么[…]?有趣的是,我现在可以把它作为一个列表的列表的列表,直到无穷。
p[1][1][1]....
只要我愿意,我可以写上面的代码,而且它仍然有效。
编辑:
它在内存中是如何表示的? 它有什么用?举一些有用的例子会很有帮助。 任何官方文件的链接都非常有用。
我在玩python。我在IDLE中使用了以下代码:
p = [1, 2]
p[1:1] = [p]
print p
输出结果是:
[1, [...], 2]
这是什么[…]?有趣的是,我现在可以把它作为一个列表的列表的列表,直到无穷。
p[1][1][1]....
只要我愿意,我可以写上面的代码,而且它仍然有效。
编辑:
它在内存中是如何表示的? 它有什么用?举一些有用的例子会很有帮助。 任何官方文件的链接都非常有用。
当前回答
这是您的代码所创建的
它是一个列表,其中第一个和最后一个元素指向两个数字(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)
他们会被铭记为
其他回答
根据我的理解,这是一个不动点的例子
p = [1, 2]
p[1:1] = [p]
f = lambda x:x[1]
f(p)==p
f(f(p))==p
这是您的代码所创建的
它是一个列表,其中第一个和最后一个元素指向两个数字(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)
他们会被铭记为
对于“它有什么用”这个问题,这里有一个具体的例子。
图约简是一种评估策略,有时用于解释计算机语言。这是惰性求值的常用策略,尤其是在函数式语言中。
起点是建立一个表示程序将采取的“步骤”序列的图。根据程序中使用的控制结构,这可能会导致循环图(因为程序包含某种“永远”循环——或者使用递归,其“深度”在求值时已知,但在图创建时不知道)……
为了表示这样的图,您需要无限的“数据结构”(有时称为递归数据结构),就像您注意到的那样。通常情况下,会更复杂一些。
如果你对这个话题感兴趣,这里有一个关于这个主题的讲座:http://undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf
在面向对象编程中,我们经常这样做。如果任何两个对象直接或间接地相互引用,它们都是无限递归结构(或者都是同一个无限递归结构的一部分,这取决于你如何看待它)。这就是为什么你在像列表这样原始的东西中看不到这么多——因为我们通常更适合将概念描述为相互连接的“对象”,而不是“无限列表”。
你还可以得到…用无限递归字典。假设你想要一个三角形角的字典,其中每个值都是与该角相连的其他角的字典。你可以这样设置:
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(或者a或b或c),你会看到它充满了{…}因为任意两个角都指向对方。
这意味着您创建了一个嵌套在自身内部的无限列表,它不能被打印。P包含P, P包含P…等等。(…符号是一种让你知道这一点的方法,并告诉你它不能被表示!看看@6502的答案,看看发生了什么。
现在,关于你编辑后的三个新项目:
这个答案似乎涵盖了一切 Ignacio的链接描述了一些可能的用途 这更像是一个数据结构设计的主题,而不是编程语言,所以在Python的官方文档中不太可能找到任何参考