如何正确更新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 deepcopy
和 deepcopy(my_dict)
而不是内置的复制功能。 (如其他答案)。对于提供的问题,这无关紧要,但对于未来的读者来说,它可能是相关的。对于给定的问题,我可能会使用您的答案而不是使用 deepcopy。
谢谢你,你是救命稻草)以上是关于如何正确更新dict中的dict? (Python)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
从嵌套的dict中选择一个随机值,并在另一个嵌套的dict中更新它