在Python中更改列表列表中的字典

时间:2014-02-15 14:26:48

标签: python

很抱歉,如果这是一个基本的Python问题,但出于某种原因,我无法理解这一点。

假设我创建了一个字典列表列表,

b=[[{'j':1}]*3]*3

这样“b”就是这样:

[[{'j': 1}, {'j': 1}, {'j': 1}],
[{'j': 1}, {'j': 1}, {'j': 1}],
[{'j': 1}, {'j': 1}, {'j': 1}]] 

现在假设我想将“b”改为:

[[{'j': 1}, {'j': 1}, {'j': 1}],
[{'j': 1}, {'j': 1}, {'j': 90}],
[{'j': 1}, {'j': 1}, {'j': 1}]] 

所以我天真地使用这行代码

b[1][2]['j']=90

然而,“b”现在是这样的:

[[{'j': 90}, {'j': 90}, {'j': 90}],
[{'j': 90}, {'j': 90}, {'j': 90}],
[{'j': 90}, {'j': 90}, {'j': 90}]] 

为什么列表列表中的所有词典都会发生变化?为什么不仅b [​​1] [2]条目改变了?

另外,行

b=[[{'j':1}]*3]*3
b[1][2]={'j':90} 

将“b”更改为

[[{'j': 1}, {'j': 1}, {'j': 90}],
[{'j': 1}, {'j': 1}, {'j': 90}],
[{'j': 1}, {'j': 1}, {'j': 90}]] 

我也无法解释。

1 个答案:

答案 0 :(得分:2)

您需要使用字典的copy()命令,否则您将创建对同一字典的多个引用。

尝试这样的事情:

>>> c = {'j':1}
>>> b = [c, c.copy(), c.copy()]
>>> b
[{'j': 1}, {'j': 1}, {'j': 1}]
>>> b[2]['j']=2
>>> b
[{'j': 1}, {'j': 1}, {'j': 2}]
相关问题