【问题标题】:Do I need to use list() to append a list into another list in Python?我是否需要使用 list() 将列表附加到 Python 中的另一个列表中?
【发布时间】:2016-03-10 17:43:30
【问题描述】:

我正在尝试将小 (num) 列表附加到最终列表 (lst)。 小列表在循环中被修改,并且在每次修改时,它们都被附加到最终列表中。 但结果很奇怪,我不喜欢这个解决方案。 这是代码。

n   = 3
num = []
lst = []

for i in range(n) :
    num.append(0)

lst.append(num)

for j in range(n-1) :
    for i in range(n) :
        num[i] += 1
        lst.append(num)

for each in lst :
    print each

这段代码的结果是:

[2, 2, 2]
[2, 2, 2]
[2, 2, 2]
[2, 2, 2]
[2, 2, 2]
[2, 2, 2]
[2, 2, 2]

但是,如果我不使用lst.append(num),而是使用lst.append(list(num)),我会得到预期的结果:

[0, 0, 0]
[1, 0, 0]
[1, 1, 0]
[1, 1, 1]
[2, 1, 1]
[2, 2, 1]
[2, 2, 2]

这真的是将一个列表的值附加到另一个列表的正确方法吗?

更新: 我看到当我执行lst.append(num) 时,这并不意味着num 的值被附加到lst。这是一个参考,因为我更改了 num 的内容,最后,我的列表 lst 的所有条目都将引用最终的 num .但是,如果我这样做:

lst = []

for i in range(3) :
    num = i
    lst.append(num)

for each in lst :
    print each

我得到了预期的结果,即具有值 [0, 1 , 2] 的列表 lst。在这种情况下,num 在每次迭代时都会改变,其最终值为 num=2。

【问题讨论】:

  • 提示:试试[id(x) for x in lst]
  • 如果你想用另一个列表扩展(就地修改)一个列表,你可以使用a.extend(b)
  • 您看到的问题是因为您将对num 的引用放入lst,而不是现在看起来的num 副本。当您执行lst.append(list(num)) 时,您正在制作num副本 并将其放入lst,然后当您修改num 时该副本不会更改。
  • 你没有注意到奇怪的事情吗?例如,在第 8 行,我将“num”附加到“lst”。此时,列表 'num' 为 [0, 0, 0]。但是最后当我打印时,这个值不会出现在列表“lst”中。更新:@TomDalton 这就是我的想法。

标签: python list append


【解决方案1】:

让我们仔细看看这个循环。

for i in range(n) :
     num[i] += 1
     lst.append(num)

您多次附加相同的num。因此,lst 的所有元素都对列表num 具有相同的引用,并且您在每次迭代时都对其进行更新。这就是为什么您在循环完成后在 lst 的每个元素上获得相同值的原因。

但是,当您执行lst.append(list(num)) 时,您每次都会生成一个新列表。所以,lst 的每个元素都有不同的引用。你得到了预期的输出。

因此,要回答您的问题,您将列表添加到列表的方式很好。这就是你应该这样做的方式。这与您的预期结果无关。

【讨论】:

  • 好的。我明白了。谢谢你。但我现在还有另一个问题。如果我稍后完全更改 num 的值并附加到列表中,例如:`num = 'other thing' lst.append(num)` 那么结果是:` [2, 2, 2] [2, 2, 2] [2, 2, 2] [2, 2, 2] [2, 2, 2] [2, 2, 2] [2, 2, 2] 其他 `
  • 另见“如何在 Python 中复制对象?”在Programming FAQ。 list(num) 不是复制列表的好方法。
  • @mkiever 我现在看到最好使用 num[:] 而不是 list(num) 将 num 的值作为列表复制到另一个列表
【解决方案2】:

我认为对您的结果的解释是,当您执行 num[i] += 1 时,您实际上是在修改在循环的先前阶段附加在 lst 中的 num 的前面副本。当您执行lst.append(list(num)) 时,您正在创建num 的唯一版本。

【讨论】:

    猜你喜欢
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多