避免在for循环中更新嵌套列表

时间:2016-02-18 19:59:06

标签: python list nested

我有一个Python程序,我想在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 个答案:

答案 0 :(得分:3)

array.append(road)

将此更改为

array.append(road[:])

附加列表的副本。这样,您可以附加多个不同的列表,而不是重复附加的相同列表对象。

答案 1 :(得分:3)

您的问题是<Handling>。这是创建一个浅表,这是原始的克隆。当你改变其他人时,这会改变。

要避免这种情况,您需要一个新列表。要做到这一点,您可以使用约翰建议的<Handling>,或者您可以使用array.append(road),这可以更容易阅读 - 并且更明显它的作用。

所以,而不是[:]使用list()