我在Python中进行了一些尝试。我在IDLE中使用了以下代码:
p = [1, 2]
p[1:1] = [p]
print p
输出结果为:
[1, [...], 2]
这是什么[...]
?有趣的是,我现在可以将其用作无限嵌套的列表,例如:
p[1][1][1]....
只要我想写得足够长,它仍然有效。
编辑:
- 它在内存中是如何表示的?
- 它有什么用途?一些实用案例会很有帮助。
- 任何官方文档链接都将非常有用。
这是您的代码创建的内容
这是一个列表,其中第一个和最后一个元素指向两个数字(1和2),而中间的元素指向列表本身。
在Common 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)
然后它们将作为内存中的一部分。
#(1 #1=#(2 #1# 3))
和#1=#(1 #(2 #1# 3))
。 - 6502#1=(1 . #1#)
创建“无限列表”。 - 6502对于“它有什么用”的问题,这里有一个具体的例子。
图形简化是一种评估策略,有时用于解释计算机语言。这是惰性求值的常见策略,特别是函数式语言。
起点是构建代表程序将采取的“步骤”序列的图形。根据程序中使用的控制结构,这可能导致一个循环图(因为程序包含某种“永远”循环 - 或使用递归,其“深度”将在评估时间而不是在图形创建时间确定)...
为了表示这样的图形,您需要无限的“数据结构”(有时称为递归数据结构),就像您注意到的那个一样。通常会更加复杂。
如果您对这个主题感兴趣,这里有一篇关于该主题的演讲稿(除此之外还有很多其他资源):
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
),你会看到它们中都充满了{...}
,因为任意两个角都相互引用。a = {}; a ['a'] = a; print a['a']['a']['a']
- user650654p = [1, 2]
p[1:1] = [p]
f = lambda x:x[1]
f(p)==p
f(f(p))==p
p = [1]; p[0] = p
示例之后才尝试了这个示例,该示例需要f = lambda x:x[0]
才能正常工作。这是一个不动点的示例,但我还没有看到知道这对我们有什么用处。不动点的真正价值在于以递归或迭代方式从其他某些点到达它。如果可能的话,展示如何使用原始问题的列表结构创建Y组合器的示例将非常有帮助。 - dansalmoq = lambda: q
使一个可无限调用的lambda函数。 - whackamadoodle3000
p = [1]; p[0] = p
。 - arshajiip 3: [1, <Recursion on list with id=3074777548>, 2]
。你运行了什么? - Aseem Bansalid=3074777548
是p
的标识符,因此很容易理解它是在引用自身。总之,非常好的问题 @Zel。 - Rahul Gautam