【问题标题】:How to correctly update dict in dict? (Python) [duplicate]如何正确更新dict中的dict? (Python)[重复]
【发布时间】: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 对象。谷歌深拷贝和浅拷贝。
  • 使用字典的副本而不是使用相同的引用。

标签: python


【解决方案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。
  • 谢谢你,你是救命稻草)
猜你喜欢
  • 2020-07-30
  • 2021-10-17
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 2010-10-13
  • 2010-10-17
  • 2017-09-08
  • 2022-11-13
相关资源
最近更新 更多