如果我运行以下代码
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循环如何创建这样的列表?
答案 0 :(得分:11)
让我们给您的子列表命名:
a = [1, 2]
b = [3, 4]
c = [5, 6]
data = [a, b, c]
您的第一个循环将a
,b
和c
依次绑定到x
。当循环终止时,您已经有效设置了x = c
。
第二个循环现在将a
,b
和c
依次绑定到x[0]
。这对于a
和b
很好,但是对于c
,您实际上是在做c[0] = c
,创建了循环引用。由于list
可以捕捉到,因此它不会尝试打印[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
...
答案 1 :(得分:5)
那是因为您使用x[0]
作为循环变量(这是一种不好的做法),它作为列表存在,而不是像您在for
进行迭代时那样的新名称>
for x[0] in data:
print(x)
并且x
在data
中,因此有一个循环引用(因此ellipsis representation可以避免一遍又一遍地打印相同数据时的无限递归)
更多详细信息:
省略号出现在最后一个元素上,因为前一个循环将x
绑定到data
([5,6]
)的最后一个元素上。
因此,第二个循环将[5,6]
分配给x[0]
,但它也是x
。要消除这种情况,可以在第二个循环之前创建x
的副本:x = x[:]