这是我正在研究的项目的一部分,我的问题是,当我只想将它们附加到带有键'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': []}
谢谢!
此问题是可变默认参数问题的变形:"Least Astonishment" and the Mutable Default Argument
问题是,A
和B
的两个列表实际上是相同的!
>>> 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)
您的问题的答案恰好是documentation of fromkeys()
:
fromkeys()
是返回新字典的类方法。 值默认为fromkeys()。所有的值仅涉及一个实例,因此通常value成为可变对象没有意义例如空列表。要获取不同的值,请改用None
。