为什么我不能使用python在字典中仅附加一个值

问题描述 投票:0回答:2

这是我正在研究的项目的一部分,我的问题是,当我只想将它们附加到带有键'A'的项时,我不知道为什么将这些值分配给所有键,也许还有另一种思考方式,我需要追加列表,为每个键创建一个大列表。

speakers = ['A','B']
fragments = dict.fromkeys(speakers,[])
TAGS = ['A', ['121560', '124390']]
fragments[TAGS[0]].append(list(map(int,TAGS[1])))
print(fragments)
{'A': [[121560, 124390]], 'B': [[121560, 124390]]}

我需要获得:{'A': [[121560, 124390]], 'B': []}

如果我再做一次:fragments[TAGS[0]].append(list(map(int,TAGS[1])))

然后我应该得到:{'A': [[121560, 124390],[121560, 124390]], 'B': []}

谢谢!

python list dictionary append
2个回答
1
投票

此问题是可变默认参数问题的变形:"Least Astonishment" and the Mutable Default Argument

问题是,AB的两个列表实际上是相同的!

>>> id(fragments['A']) == id(fragments['B'])
True  # They both point to the same list object in memory.

一种解决方案是使用字典理解来用空列表实例化字典。

fragments = {k: list() for k in speakers}

另一个解决方案是将defaultdict与列表一起用作默认工厂。

from collections import defaultdict

fragments = defaultdict(list)

0
投票

您的问题的答案恰好是documentation of fromkeys()

fromkeys()是返回新字典的类方法。 默认为fromkeys()。所有的值仅涉及一个实例,因此通常value成为可变对象没有意义例如空列表。要获取不同的值,请改用None

© www.soinside.com 2019 - 2024. All rights reserved.