将1D列表附加到2D列表中并稍后修改它也会修改先前的条目

时间:2017-01-18 10:25:11

标签: python

我猜,list是一个对象,所以这种行为必须是因为它的引用被追加,所以所有的元素都得到了更新! 这是如何正确运作的,以及正确的方法是什么?

代码(增加发现的索引位置):

# generating labels for debugging
#labels = [3]*3 + [1]*3  + [4]*2
labels = [3, 3, 3, 1, 1, 1, 4, 4]
print "labels list is", labels

counter_table = []
#counter = [0]*6
counter = [0 for i in range(6)]
for i in labels:
    curr_label = i
    counter[curr_label] = counter[curr_label] + 1
    print "current counter list is", counter
    counter_table.append(counter)
print "final counter_table is", counter_table

输出:

labels list is [3, 3, 3, 1, 1, 1, 4, 4]
current counter list is [0, 0, 0, 1, 0, 0]
current counter list is [0, 0, 0, 2, 0, 0]
current counter list is [0, 0, 0, 3, 0, 0]
current counter list is [0, 1, 0, 3, 0, 0]
current counter list is [0, 2, 0, 3, 0, 0]
current counter list is [0, 3, 0, 3, 0, 0]
current counter list is [0, 3, 0, 3, 1, 0]
current counter list is [0, 3, 0, 3, 2, 0]
final counter_table is [[0, 3, 0, 3, 2, 0], [0, 3, 0, 3, 2, 0], [0, 3, 0, 3, 2, 0], [0, 3, 0, 3, 2, 0], [0, 3, 0, 3, 2, 0], [0, 3, 0, 3, 2, 0], [0, 3, 0, 3, 2, 0], [0, 3, 0, 3, 2, 0]]

2 个答案:

答案 0 :(得分:2)

您重复使用counter的引用,这可能就是您想要记住发生的事情。

所以只需存储一份清单

counter = [0]*6
for curr_label in labels:
    counter[curr_label] += 1
    print "current counter list is", counter
    counter_table.append(counter[:]) # create a copy

除此之外:我看到你不愿意使用counter = [0]*6:在不可变对象列表中使用*完全没问题(在这种情况下没有使用相同引用的风险) )

答案 1 :(得分:0)

您需要生成列表的副本:

counter_table.append(list(counter))

否则对counter的修改将改变counter_table中的所有事件。