关于python:列表内部的字典分配导致奇怪的输出

Dictionary inside list assignment results in strange output

本问题已经有最佳答案,请猛点这里访问。

我有很多单子,里面有很多字典。我只需在外部列表中的一个列表中分配一个字典。但它会导致分配给外部列表中所有列表中的所有词典。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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("
"
)

func(R)

print(R[0])
print(R[1])

输出:

1
2
3
4
5
6
[{'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]上操作),但两个列表都被分配了。

我的索引有什么错误吗?为什么会这样?


1
2
3
4
5
6
7
8
9
di= {
     'A':[],
     'B':[],
     'C':CL,
     'D':DL
    }
R=[[],[]]
R[0].append(di)
R[1].append(di)

dididi。每次使用di不会创建单独的副本。只有一个di,所以R[0][0]R[1][[0],所有的变化都出现在同一个dict中。

要修复代码:

1
2
3
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]都指同一个潜在对象。因此,更改一个对象会更改基础对象,因此会同时更改两个对象。