二维数组的问题(字典列表)

时间:2010-11-21 12:33:18

标签: python

cell={'num':0,'state':1}
cell_2d=[]
cell_list=[]
for i in range(2):
  for j in range(2):
    cell_list=cell_list+[cell]
  cell_2d=cell_2d+[cell_list]
  cell_list=[]
print "initially:"
print cell_2d
cell_2d[0][0]['num']=-1
print "finally:"
print cell_2d

获得的输出是:

最初: [[{'state':1,'num':0},{'state':1,'num':0}],[{'state':1,'num':0},{'state' :1,'num':0}]] 最后: [[{'state':1,'num': - 1},{'state':1,'num': - 1}],[{'state':1,'num': - 1},{ 'state':1,'num': - 1}]]

当执行第11行时,我希望只更改第一个cell_2d列表的第一个元素。但输出显示cell_2d的所有元素的所有'num'都更改为-1。无法理解这种情况发生的原因。有人可以告诉我代码的错误是什么?提前完成。

2 个答案:

答案 0 :(得分:2)

好的,我明白了。您正在重用cell对象。因为Python使用引用,所以你只需要对同一个对象进行四次引用,所以当你更改一个引用时,你可以全部更改它们。

在内循环中,尝试:

cell_list = cell_list + [{'num':1, 'state':0}]

可以缩短为:

cell_list.append({'num':1, 'state':0})

或者,实际上,你可以用:

替换内部循环(用j)
cell_list = [{'num':1, 'state':0} for j in range(2)]

答案 1 :(得分:0)

只需更换此行

即可
cell_2d=cell_2d+[cell_list]

有了这个

cell_2d = cell_2d + [ cell_list.copy() ]

这样python就会从字典'cell_list'中复制而不是存储引用。