为了账号安全,请及时绑定邮箱和手机立即绑定

更新一个嵌套的 dict 也会更新另一个

更新一个嵌套的 dict 也会更新另一个

噜噜哒 2022-04-27 13:36:57
我有一个嵌套的字典,但是当我更新一个字典时,所有其他字典也会更新。我怎样才能避免这种情况?下面是一个例子:a = {}b = {'d': [], 'e': []}a[1] = ba[2] = ba[1]['e'].append([1, 2, 3])# result: {1: {'e': [[1, 2, 3]], 'd': []}, 2: {'e': [[1, 2, 3]], 'd': []}}这里'e'更新了 1 和 2,但我只想更新 1:{1: {'e': [[1, 2, 3]], 'd': []}, 2: {'e': [], 'd': []}}
查看完整描述

2 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

发生克隆更新是因为它们都是同一个字典,附加到不同的键。并非如此(如您所愿),每本字典都彼此不同。所以,如果你真的想要单独dict的 s,这里有一种方法:


In [57]: def getDict():

    ...:     return {'d':[],'e':[]}

    ...: 


In [58]: a={}


In [59]: a[1] = getDict()


In [60]: a[2] = getDict()


In [61]: a[1]['e'].append([1,2,3])


In [62]: a

Out[62]: {1: {'d': [], 'e': [[1, 2, 3]]}, 2: {'d': [], 'e': []}}


查看完整回答
反对 回复 2022-04-27
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

这是预期的行为。当你这样做时:


a = {}

b = {'d': [], 'e': []}

a[1] = b

a[2] = b

实际上,a[1] “持有”对 b 的引用。当您修改 a1 中的 b 时,您正在修改“原始”b。如果你想让一个全新的 b 独立修改,使用 copy。如果您的实际 dict 比这更复杂,您可以使用 deepcopy 或自己编写一个复制功能。


a = {}

b = {'d': [], 'e': []}

a[1] = b.copy()

a[2] = b.copy()

a[1]['e'].append([1, 2, 3])

你也可以这样做:


a = {}

b = {'d': [], 'e': []}

a[1] = b[:]

a[2] = b[:]

a[1]['e'].append([1, 2, 3])

这可以按您的预期工作。


查看完整回答
反对 回复 2022-04-27
  • 2 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信