Python-列表返回[[...],6]

时间:2019-01-06 15:33:42

标签: python python-3.x

如果我运行以下代码

data = [[1,2],[3,4],[5,6]]

for x in data:
    print(x[0])

for x[0] in data:
    print(x)

我得到以下输出

1
3
5
[[1, 2], 6]
[[3, 4], 6]
[[...], 6]

我最终得到一个包含[[...], 6]的列表,但是这个[...]列表是什么?

它不能正常工作,因为先调用y = [[...], 6],然后再执行以下语句,表明[...]0

>>> print(y)
[[Ellipsis], 6]

>>> print(y[0])
[0]

但是,当我在顶部运行代码并键入以下语句时,结果没有意义:

>>> print(x)
[[...], 6]

>>> print(x[0])
[[...], 6]

>>> print(x[0][0])
[[...], 6]

>>> print(x[0][0][0])
[[...], 6]

但是无论如何,这两个结果都是6

>>> print(x[1])
6

>>> print(x[0][1])
6

回顾一下问题:这怎么可能?[...]代表什么?顶部的for循环如何创建这样的列表?

2 个答案:

答案 0 :(得分:11)

让我们给您的子列表命名:

a = [1, 2]
b = [3, 4]
c = [5, 6]
data = [a, b, c]

您的第一个循环将abc依次绑定到x。当循环终止时,您已经有效设置了x = c

第二个循环现在将abc依次绑定到x[0]。这对于ab很好,但是对于c,您实际上是在做c[0] = c,创建了循环引用。由于list可以捕捉到,因此它不会尝试打印[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ ...

答案 1 :(得分:5)

那是因为您使用x[0]作为循环变量(这是一种不好的做法),它作为列表存在,而不是像您在for进行迭代时那样的新名称

for x[0] in data:
    print(x)

并且xdata中,因此有一个循环引用(因此ellipsis representation可以避免一遍又一遍地打印相同数据时的无限递归)

更多详细信息

省略号出现在最后一个元素上,因为前一个循环将x绑定到data[5,6])的最后一个元素上。

因此,第二个循环将[5,6]分配给x[0],但它也是x。要消除这种情况,可以在第二个循环之前创建x的副本:x = x[:]