以下代码:
rect_pos = {}
rect_pos_single = [[0,0], [50, 0], [50, 100], [0, 100]]
i = 0
while (i<3):
for j in range(4):
rect_pos_single[j][0] += 50
print rect_pos_single
rect_pos[i] = rect_pos_single
i += 1
print rect_pos
代码打印变量“rect_pos_single”的后续迭代。接下来,我将它们添加到字典“rect_pos”。键更改,但值始终相同 - 最后一次迭代。我不明白为什么?
答案 0 :(得分:1)
这一行
rect_pos_single[j][0] += 50
就地修改列表;也就是说,rect_pos_single
始终引用相同的列表对象,但您更改了该列表的内容。
这一行
rect_pos[i] = rect_pos_single
将rect_pos_single
引用的列表引用分配给rect_pos[i]
。 rect_pos
的每个元素都指向相同的列表。
最简单的更改是使用
将列表的副本分配给字典rect_pos[i] = copy.deepcopy(rect_pos_single) # Make sure you import the copy module
需要深层复制,因为rect_pos_single
是一个列表列表,并且使用rect_pos_single
执行浅层复制只会创建一个新列表,其中包含对使用{{实际修改的相同列表的引用的引用1}}。