我猜,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]]
答案 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中的所有事件。