列表分配中的字典导致奇怪的输出[重复]

Posted

技术标签:

【中文标题】列表分配中的字典导致奇怪的输出[重复]【英文标题】:Dictionary inside list assignment results in strange output [duplicate] 【发布时间】:2018-01-03 13:38:19 【问题描述】:

我有许多列表,其中包含许多字典。我只是分配给外部列表中的一个列表中的一个字典。但它会导致分配给外部列表中所有列表中的所有字典。

代码:

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

我的索引是否有任何错误?为什么会这样?

【问题讨论】:

R[0] 和 R[1] 拥有同一个字典,而不是初始字典的两个单独副本。见lucumr.pocoo.org/2011/7/9/python-and-pola/#pass-by-what-exactly 这篇文章可能对您有所帮助:Facts and myths about Python names and values,由 SO 资深人士 Ned Batchelder 撰写。 【参考方案1】:

代码

R[0].append(di)
R[1].append(di)

di 添加到R 通过引用。这意味着R[0]R[1] 都引用同一个底层对象。因此,改变一个会改变底层对象,从而改变两者。

【讨论】:

嗨..谢谢你的回答....但是你能解释一下我怎样才能解决这个问题吗? @nPab​​,Alex Hall 有办法在他的答案中修复您的代码。我推荐这种方法。【参考方案2】:
di= 
     'A':[],
     'B':[],
     'C':CL,
     'D':DL
    
R=[[],[]]
R[0].append(di)
R[1].append(di)

didididi 的每次使用都不会创建单独的副本。只有一个di,所以R[0][0]R[1][[0],所有更改都出现在同一个字典中。

修复您的代码:

from copy import deepcopy
R[0].append(deepcopy(di))
R[1].append(deepcopy(di))

【讨论】:

以上是关于列表分配中的字典导致奇怪的输出[重复]的主要内容,如果未能解决你的问题,请参考以下文章

附加到 Python 字典中的列表 [重复]

字典列表中的列表理解[重复]

将函数的输出分配给python中的空列表常量[重复]

使用字典计算列表中的项目[重复]

从python中的字典转换为列表的问题[重复]

Python:如何从列表中的字典创建 DataFrame 列 [重复]