Rul*_*rld 14 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)
Run Code Online (Sandbox Code Playgroud)
我得到以下输出
1
3
5
[[1, 2], 6]
[[3, 4], 6]
[[...], 6]
Run Code Online (Sandbox Code Playgroud)
我最终得到一个列表[[...], 6]
,但是这个[...]
列表是什么?
它不正常的行为,因为调用y = [[...], 6]
然后将下面的语句显示[...]
为0
>>> print(y)
[[Ellipsis], 6]
>>> print(y[0])
[0]
Run Code Online (Sandbox Code Playgroud)
但是,当我在顶部运行代码并键入以下语句时,结果没有意义:
>>> print(x)
[[...], 6]
>>> print(x[0])
[[...], 6]
>>> print(x[0][0])
[[...], 6]
>>> print(x[0][0][0])
[[...], 6]
Run Code Online (Sandbox Code Playgroud)
然而不知何故,这两个结果都是6
>>> print(x[1])
6
>>> print(x[0][1])
6
Run Code Online (Sandbox Code Playgroud)
回顾一下这个问题:这怎么可能,[...]
代表什么,以及顶部的for循环如何创建这样的列表?
Mad*_*ist 11
让我们给你的子名单命名:
a = [1, 2]
b = [3, 4]
c = [5, 6]
data = [a, b, c]
Run Code Online (Sandbox Code Playgroud)
你的第一个循环绑定a
,b
然后c
连续x
.当循环终止时,您已经有效地设置了x = c
.
第二个循环现在绑定a
,b
然后c
依次绑定x[0]
.这是罚款a
和b
,但c
你实际上在做c[0] = c
,创建循环引用.既然list
能够捕捉到它,就不会尝试打印[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
......
那是因为你正在使用x[0]
你的循环变量(这是一种不好的做法),它作为一个列表存在,而不是你在迭代时应该使用的新名称for
for x[0] in data:
print(x)
Run Code Online (Sandbox Code Playgroud)
并且x
是在data
所以有一个环状参考(因此省略号表示反复打印同一数据时,为了避免无限循环)
更详细:
省略号发生在最后一个元素上,因为前一个循环绑定x
在data
([5,6]
)的最后一个元素上.
所以第二个循环分配[5,6]
给x[0]
它,但它也是x
.摆脱这种情况的方法是x
在第二个循环之前创建一个副本:x = x[:]