列表分配内的字典导致奇怪的输出

时间:2017-07-27 17:25:29

标签: python list dictionary nested variable-assignment

我列出了许多列表中包含许多词典的列表。我只是在外部列表中的一个列表中分配一个字典。但它导致分配给外部列表中所有列表中的所有字典。

代码:

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] ..上运行),两个列表都已分配。

我的索引在任何地方都有错误吗?为什么会这样?

2 个答案:

答案 0 :(得分:3)

di= {
     'A':[],
     'B':[],
     'C':CL,
     'D':DL
    }
R=[[],[]]
R[0].append(di)
R[1].append(di)

di dididi的每次使用都不会创建单独的副本。只有一个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]都引用相同的底层对象。因此,更改一个会更改基础对象,从而更改两者。