【发布时间】: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 这就是我的想法。