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

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

【问题讨论】:

标签: python list dictionary nested variable-assignment


【解决方案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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多