Python 二维数组问题(dict列表列表)

Python 二维数组问题(dict列表列表),python,Python,获得的产出是: 最初: [[{'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行时,我希望仅更改单元格_2d的第一个列表的第一个元素。但是输出显示,单元格_2d的所有元素的所有'num'都更

获得的产出是:

最初: [[{'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行时,我希望仅更改单元格_2d的第一个列表的第一个元素。但是输出显示,单元格_2d的所有元素的所有'num'都更改为-1。我不知道为什么会这样。有人能告诉我代码有什么错误吗?Thanx提前。好的,我知道了。您正在重用
单元格
对象。因为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
可缩短为:

cell_list = cell_list + [{'num':1, 'state':0}]
或者,事实上,您可以将内环(用j)替换为:


只需更换这一行

cell_list = [{'num':1, 'state':0} for j in range(2)]
用这个

cell_2d=cell_2d+[cell_list]

通过这种方式,python将从字典“cell_list”中复制一个副本,而不是存储一个引用。

您可以编辑您的答案,并使用101010按钮标记代码部分,以便将其格式化为代码吗?@Newbie_python:这也更有效。始终对单个项目使用
.append
,对两个列表使用
.extend
+=
。同样作为一个原则问题,如果你曾经这样做过,不要做
cell\u list=cell\u list+…
,而是做
cell\u list+=…
;它更整洁、更快(在适当的位置而不是创建另一个新列表)。除此之外,还可以执行cell_list.append(dict(cell)),这将生成cell的新副本。由于单元格的内容由不可变类型组成,这是安全的。@chris和extranon:thanx fr建议:)单元格列表不是字典。这是一份字典清单。所以copy()方法在单元格列表上不起作用
cell_2d=cell_2d+[cell_list]
cell_2d = cell_2d + [ cell_list.copy() ]