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

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].这是罚款ab,但c你实际上在做c[0] = c,创建循环引用.既然list能够捕捉到它,就不会尝试打印[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[......


Jea*_*bre 5

那是因为你正在使用x[0]你的循环变量(这是一种不好的做法),它作为一个列表存在,而不是你在迭代时应该使用的新名称for

for x[0] in data:
    print(x)
Run Code Online (Sandbox Code Playgroud)

并且x是在data所以有一个环状参考(因此省略号表示反复打印同一数据时,为了避免无限循环)

更详细:

省略号发生在最后一个元素上,因为前一个循环绑定xdata([5,6])的最后一个元素上.

所以第二个循环分配[5,6]x[0]它,但它也是x.摆脱这种情况的方法是x在第二个循环之前创建一个副本:x = x[:]