我列出了许多列表中包含许多词典的列表。我只是在外部列表中的一个列表中分配一个字典。但它导致分配给外部列表中所有列表中的所有字典。
代码:
CL=3*[0]
DL=4*[0]
di= {
'A':[],
'B':[],
'C':CL,
'D':DL
}
R=[[],[]]
R[0].append(di)
R[1].append(di)
def func(dd):
dd[0][0]['A'].append("BANANA")
dd[0][0]['B'].append("ELEPHANT")
dd[0][0]['C'][0]='BLUE'
dd[0][0]['D'][3]='ROCK'
dd[0][0]['D'][2]=1111
print(R[0])
print(R[1])
print("\n")
func(R)
print(R[0])
print(R[1])
输出:
[{'A': [], 'C': [0, 0, 0], 'B': [], 'D': [0, 0, 0, 0]}]
[{'A': [], 'C': [0, 0, 0], 'B': [], 'D': [0, 0, 0, 0]}]
[{'A': ['BANANA'], 'C': ['BLUE', 0, 0], 'B': ['ELEPHANT'], 'D': [0, 0, 1111, 'ROCK']}]
[{'A': ['BANANA'], 'C': ['BLUE', 0, 0], 'B': ['ELEPHANT'], 'D': [0, 0, 1111, 'ROCK']}]
正如你所看到的,即使我在外部列表的第一个列表中为字典赋值(func()仅在dd [0] ..上运行),两个列表都已分配。
我的索引在任何地方都有错误吗?为什么会这样?
答案 0 :(得分:3)
di= {
'A':[],
'B':[],
'C':CL,
'D':DL
}
R=[[],[]]
R[0].append(di)
R[1].append(di)
di
di
是di
。 di
的每次使用都不会创建单独的副本。只有一个di
,因此R[0][0]
为R[1][[0]
,并且所有更改都出现在同一个字典中。
修复您的代码:
from copy import deepcopy
R[0].append(deepcopy(di))
R[1].append(deepcopy(di))
答案 1 :(得分:2)
代码
R[0].append(di)
R[1].append(di)
通过引用将di
添加到R
。这意味着R[0]
和R[1]
都引用相同的底层对象。因此,更改一个会更改基础对象,从而更改两者。