2

我在 python 中的 for 循环中有奇怪的行为。问题不完全是这个问题,但非常类似于:

a = []
b = [1,2,3,4]
for i in xrange (0,10):
     a.append(b)
     b[3] += 1

结果是:

a = [[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14]]

我期待的结果是

a =  [[1,2,3,4],[1,2,3,5],[1,2,3,6],[1,2,3,7],.....,[1,2,3,14]]

我不知道为什么在每次迭代中,b[3] 被添加到 14,然后列表 [1,2,3,14] 被添加到 a。我认为 b[3] 在每次迭代时应该只增加 1

4

3 回答 3

7

您的问题是每次迭代都会附加对同一数组的引用,并不断更改它。

最简单的解决方法是将附加更改为

 a.append(list(b))

这将使每次迭代都将(浅)副本附加到目标数组,而不是引用。

于 2012-06-20T11:17:53.323 回答
4

b通过引用访问,因此当您修改它时,它会影响您一遍又一遍地b[3]附加到它的每个引用 。a要解决此问题,您只需b每次创建一个新副本:

a = []
b = [1,2,3,4]
for i in xrange (0,10):
     a.append(b[:])
     b[3] += 1
于 2012-06-20T11:18:52.620 回答
2

你可以使用deepcopy

from copy import deepcopy
a = []
b = [1,2,3,4]
for i in xrange (0,10):
     a.append(deepcopy(b))
     b[3] += 1
于 2012-06-20T11:33:25.077 回答