省略号[...]在列表中的含义是什么?

Ase*_*sal 189 python list ellipsis python-2.7 python-3.x

我在蟒蛇玩耍.我在IDLE中使用了以下代码:

p  = [1, 2]
p[1:1] = [p]
print p
Run Code Online (Sandbox Code Playgroud)

输出是:

[1, [...], 2]
Run Code Online (Sandbox Code Playgroud)

这是什么[…]?有趣的是,我现在可以将其用作无限列表列表,即

p[1][1][1]....
Run Code Online (Sandbox Code Playgroud)

只要我愿意,我就可以写上面的内容,但它仍然有用.

编辑:

  • 它在记忆中如何表现?
  • 有什么用?某些有用的案例会有所帮助.
  • 任何官方文档的链接都非常有用.

650*_*502 311

这是您的代码创建的

在此输入图像描述

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

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

#1=#(1 #1# 2)
Run Code Online (Sandbox Code Playgroud)

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

在Python中,您只需获得结构为圆形的信息[...].

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

[1, [2, [...], 3]]
Run Code Online (Sandbox Code Playgroud)

向后引用可以指向外部列表或内部列表.可以使用相同的方式打印这两种不同的结构

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

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

print(x)
print(y)
Run Code Online (Sandbox Code Playgroud)

他们会像记忆一样

在此输入图像描述

  • @BurhanKhalid:第一个是inkscape,第二个是gimp(因为我扔掉了svg) (5认同)
  • +1用于说明,特别是如果你手工绘制它. (3认同)
  • @csharpler:当然你可以通过分析内容来区分这两者,但是它们用相同的表示法打印.在Common Lisp格式中,对于`y,它们是`#(1#1 =#(2#1#3))`对于`x`和`#1 =#(1#(2#1#3))` `. (2认同)
  • +如果你想像这样绘制acsii图,请尝试:[Asiiflow](http://www.asciiflow.com/#Draw) (2认同)

Ósc*_*pez 107

这意味着您创建了一个嵌套在其自身内的无限列表,无法打印.p包含p哪个包含p......等等.该[...]符号是一个方法,让你知道这一点,并通知它不能代表!看看@ 6502的答案,看看一张漂亮的图片,展示正在发生的事情.

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

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

  • @Zel:列表元素是引用.第二个元素是对列表本身的引用. (19认同)
  • Python它将它识别为一个无限循环的引用,所以它决定将其缩短,它并不是无限的.不,除了思想实验之外,它不是真的_useful_ :) (2认同)
  • 有......无限递归结构的一些用途.但并不多. (2认同)

Syl*_*oux 22

关于"它的用途是什么"这个问题,这是一个具体的例子.

图形缩减是一种用于解释计算机语言的评估策略.这是懒惰评估的常用策略,尤其是函数式语言.

起点是构建一个图表,表示程序将采取的"步骤"顺序.根据该程序中使用的控制结构,这可能会导致循环图(因为程序包含某种"永久"循环 - 或者使用递归,其"深度"将在评估时知道,但不会在图形 -创作时间)...

为了表示这样的图形,您需要无限的 "数据结构"(有时称为递归数据结构),就像您注意到的那样.通常,虽然有点复杂.

如果您对该主题感兴趣,请参阅(以及其他许多人)关于该主题的讲座:http:
//undergraduate.csse.uwa.edu.au/units/CITS3211/lectureNotes/14.pdf


nmc*_*ean 7

我们一直在面向对象编程中这样做.如果任何两个对象直接或间接地相互引用,它们都是无限递归结构(或者是同一个无限递归结构的两部分,具体取决于你如何看待它).这就是为什么你没有在列表中看到这么多原因 - 因为我们通常最好将概念描述为互连的"对象"而不是"无限列表".

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

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
Run Code Online (Sandbox Code Playgroud)

现在,如果您打印triangle(或abc为此事),你会看到它充满了{...},因为任何两个角指的是回对方.