如何正确更新dict中的dict?(Python)

Nav*_*ava 0 python

我有以下代码:

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)
Run Code Online (Sandbox Code Playgroud)

结果是:

{'Arsenal': {'matches_played': 0, 'won': 1, 'draws': 0, 'loss': 1, 'points': 0}, 
'Chelsea': {'matches_played': 0, 'won': 1, 'draws': 0, 'loss': 1, 'points': 0}}
Run Code Online (Sandbox Code Playgroud)

但是我需要

{'Arsenal': {'matches_played': 0, 'won': 1, 'draws': 0, 'loss': 0, 'points': 0}, 
'Chelsea': {'matches_played': 0, 'won': 0, 'draws': 0, 'loss': 1, 'points': 0}}
Run Code Online (Sandbox Code Playgroud)

您能解释一下为什么会发生这种情况吗?

小智 5

stat传递给关键的“切尔西”和“阿森纳”作为参考。您需要创建它的副本。

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)
Run Code Online (Sandbox Code Playgroud)

  • 虽然有 1 个小细节,但答案很好。如果您要复制的字典具有嵌套的可变对象,例如“list”或另一个“dict”,您应该使用“from copy import deepcopy”和“deepcopy(my_dict)”而不是内置的复制函数。(如其他答案)。对于所提供的问题,这并不重要,但对于未来的读者来说,这可能是相关的。对于给定的问题,我可能会使用您的答案而不是使用深度复制。 (2认同)