如果我运行以下代码
data = [[1,2],[3,4],[5,6]]
for x in data:
print(x[0])
for x[0] in data:
print(x)
我得到以下输出
^{pr2}$最后我得到一个包含[[...], 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循环如何创建这样的列表?在
让我们给你的子列表命名:
第一个循环将}依次绑定到
a
、b
和{x
。当循环终止时,您已经有效地设置了x = c
。在第二个循环现在将}依次绑定到
a
、b
和{x[0]
。这对于a
和b
来说很好,但是对于c
,您实际上在做c[0] = c
,创建一个循环引用。因为list
能够捕捉到这个,所以它不会尝试打印[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
。。。在这是因为您使用
x[0]
作为循环变量(这是一个错误的做法),它是以列表的形式存在的,而不是像在使用for
进行迭代时应该使用的新名称并且
x
在data
中,所以有一个循环引用(因此{a1}可以避免反复打印相同数据时的无限递归)更多详细信息:
省略号出现在最后一个元素上,因为上一个循环绑定了
data
([5,6]
)的最后一个元素上。在所以第二个循环将
[5,6]
分配给x[0]
,但它也是x
。解决这个问题的方法是在第二个循环之前创建x
的副本:x = x[:]
相关问题 更多 >
编程相关推荐