如果我运行以下代码
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循环如何创建这样的列表?
发布于 2019-01-06 15:42:04
让我们给出您的子列表名称:
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能捕捉到,它就不会尝试打印[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[.
发布于 2019-01-06 15:37:45
这是因为您使用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[:]的副本。
https://stackoverflow.com/questions/54063064
复制相似问题