Python 字典内部列表赋值导致奇怪的输出

Python 字典内部列表赋值导致奇怪的输出,python,list,dictionary,nested,variable-assignment,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

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

守则:

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的第一个列表中为字典赋值,但这两个列表都是赋值的

我的索引有错误吗?为什么会发生这种情况?

代码

R[0].append(di)
R[1].append(di)
通过引用将di添加到R。这意味着R[0]和R[1]都引用相同的底层对象。因此,更改一个对象会更改基础对象,从而同时更改这两个对象。

代码

R[0].append(di)
R[1].append(di)
di= {
     'A':[],
     'B':[],
     'C':CL,
     'D':DL
    }
R=[[],[]]
R[0].append(di)
R[1].append(di)
通过引用将di添加到R。这意味着R[0]和R[1]都引用相同的底层对象。因此,更改一个对象会更改基础对象,从而同时更改这两个对象

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],所有更改都显示在同一个DIC中

要修复代码,请执行以下操作:

from copy import deepcopy
R[0].append(deepcopy(di))
R[1].append(deepcopy(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))

R[0]和R[1]拥有相同的词典,而不是初始词典的两个单独副本。请参阅本文,您可能会发现这篇文章很有帮助:,它是由SO Batchelder编写的。R[0]和R[1]拿着同一本字典,而不是最初字典的两份副本。你可能会发现这篇文章很有帮助:,它是由经验丰富的Ned Batchelder写的。嗨..谢谢你的答案..但是你能解释一下我如何解决这个问题吗?@nPab,Alex Hall有办法在他的答案中修复你的代码。我推荐这种方法。嗨..Th我很想知道答案……但你能解释一下我该如何解决这个问题吗?@nPab,Alex Hall有办法在他的答案中修复你的代码。我推荐这种方法。