如何正确更新dict中的dict? (Python)[重复]

Posted

技术标签:

【中文标题】如何正确更新dict中的dict? (Python)[重复]【英文标题】:How to correctly update dict in dict? (Python) [duplicate] 【发布时间】:2020-03-01 21:25:23 【问题描述】:

我有以下代码:

some = 
stat = 'matches_played': 0, 'won': 0, 'draws': 0, 'loss': 0, 'points': 0
some = 'Arsenal': stat
some.update('Chelsea': stat)
some['Arsenal']['won'] += 1
some['Chelsea']['loss'] += 1
print(some)

结果是:

'Arsenal': 'matches_played': 0, 'won': 1, 'draws': 0, 'loss': 1, 'points': 0, 
'Chelsea': 'matches_played': 0, 'won': 1, 'draws': 0, 'loss': 1, 'points': 0

但是,我需要

'Arsenal': 'matches_played': 0, 'won': 1, 'draws': 0, 'loss': 0, 'points': 0, 
'Chelsea': 'matches_played': 0, 'won': 0, 'draws': 0, 'loss': 1, 'points': 0

你能解释一下,为什么会这样吗?

【问题讨论】:

您为两个团队持有相同的 dict 对象。谷歌深拷贝和浅拷贝。 使用字典的副本而不是使用相同的引用。 【参考方案1】:

尝试复制字典以避免更新具有相同引用的字典

import copy

some = 

stat = 'matches_played': 0, 'won': 0, 'draws': 0, 'loss': 0, 'points': 0

some = 'Arsenal': copy.deepcopy(stat), 'Chelsea' : copy.deepcopy(stat)


some['Arsenal']['won'] += 1

some['Chelsea']['loss'] += 1

print(some)

Results: 'Chelsea': 'loss': 1, 'won': 0, 'draws': 0, 'matches_played': 0, 'points': 0, 'Arsenal': 'loss': 0, 'won': 1, 'draws': 0, 'matches_played': 0, 'points': 0

【讨论】:

谢谢,非常感谢。【参考方案2】:

stat 被传递给键“Chelsea”和“Arsenal”作为参考。您需要创建它的副本。

some = 
stat = 'matches_played': 0, 'won': 0, 'draws': 0, 'loss': 0, 'points': 0
some = 'Arsenal': stat
some.update('Chelsea': stat.copy()) # <---- fix it here
some['Arsenal']['won'] += 1
some['Chelsea']['loss'] += 1
print(some)

【讨论】:

不错的答案,虽然有 1 个小细节。如果您要复制的字典具有嵌套的可变对象,例如 list 或另一个 dict,您应该使用 from copy import deepcopydeepcopy(my_dict) 而不是内置的复制功能。 (如其他答案)。对于提供的问题,这无关紧要,但对于未来的读者来说,它可能是相关的。对于给定的问题,我可能会使用您的答案而不是使用 deepcopy。 谢谢你,你是救命稻草)

以上是关于如何正确更新dict中的dict? (Python)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python如何更新dict而不覆盖其他值[重复]

从嵌套的dict中选择一个随机值,并在另一个嵌套的dict中更新它

Python中dict的特点更新dict遍历dict

从Dicts Python 3中删除换行符

如何根据另一个字段更新 mongodb 中的数组 dict 元素

如何使用TensorFlow中的Dataset API(使用内置输入管道,告别‘feed-dict’ )