2016-02-18 67 views
1

我有一个Python程序,我想要在for循环中创建不同的列表,然后将这些列表存储在另一个列表中以创建一个数组。我接收一个输入列表,修改它并将其附加到存储列表中,然后重复。我的问题是,当我更新循环中的下一个列表时,数组中的所有列表也会更新,所以我最终得到一个包含多个相同列表的数组。避免更新for循环中的嵌套列表

array = []  
road = [1,0,0,0,0,0,0,0] 
    array.append(road) 

    for i in range(0,len(road)-1): 
     if road[i] == 1: 
      road[i] = 0 
      road[i+1] = 1 
     print(road) 
     array.append(road) 

打印(公路)产生正是我想即

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

,但最后一次迭代后的数组包含

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

,并在第一次迭代后

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

我可以做什么当我更改for循环中的列表时,是否要停止更新数组?

回答

2
array.append(road) 

更改为

array.append(road[:]) 

追加列表的副本。这样你就可以添加多个不同的列表,而不是重复附加同一个列表对象。

+0

具体来说,它附加了'list'的_shallow_副本;也就是说,由于'list'包含不可变对象('int'),所以这很好。如果'road'是'list'的'list'虽然,你会想要使用'copy.deepcopy'。 – ShadowRanger

2

您的问题是array.append(road)。这是创建一个浅表,这是原始的克隆。当您更改其他人时,这会发生变化。

为了避免这种情况,您需要一个新的列表。为了做到这一点,你可以使用约翰建议的[:],或者你可以使用list(),它可以更容易阅读 - 更明显的是它的作用。

因此,而不是array.append(road)使用array.append(list(road))