【问题标题】:Python - List returning [[...], 6] [duplicate]Python - 列表返回 [[...],6] [重复]
【发布时间】:2019-06-01 10:47:14
【问题描述】:

如果我运行以下代码

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 循环如何创建这样的列表?

【问题讨论】:

  • 奇怪的是我在搜索中找不到那个问题,它似乎完美地回答了这个问题。唯一没有回答的问题是 for 循环是如何创建这样一个列表的? @jonrsharpe
  • 因为循环的每一步都将下一个元素从x 分配给x[0]。这两个循环相同。

标签: python python-3.x


【解决方案1】:

让我们为您的子列表命名:

a = [1, 2]
b = [3, 4]
c = [5, 6]
data = [a, b, c]

您的第一个循环将abc 依次绑定到x。当循环终止时,您已经有效地设置了x = c

第二个循环现在将abc 依次绑定到x[0]。这对ab 来说很好,但对于c,你实际上是在做c[0] = c,创建一个循环引用。由于list 能够捕捉到它,它不会尝试打印[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[...

【讨论】:

    【解决方案2】:

    那是因为您使用 x[0] 作为循环变量(这是不好的做法),它以列表的形式存在,而不是像使用 for 进行迭代时应该使用的新名称

    for x[0] in data:
        print(x)
    

    xdata 中,所以存在循环引用(因此ellipsis representation 是为了避免在反复打印相同数据时无限递归)

    更详细的

    省略号发生在最后一个元素上,因为上一个循环将x 绑定到data ([5,6]) 的最后一个元素上。

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

    【讨论】:

    • 很好的答案,所以 [...] 代表同一个列表的无限循环?
    • ... 是表示循环的方式。
    猜你喜欢
    • 2014-04-11
    • 2015-03-22
    • 2018-06-22
    • 2018-06-25
    • 1970-01-01
    • 2020-07-22
    • 2015-07-01
    • 2018-02-09
    • 2020-06-04
    相关资源
    最近更新 更多