我正面临一个非常简单而奇怪的Python问题。
我有一个带有几个键的字典,其中包含空列表。 我想追加/扩展特定键列表的内容。 因此我认为的代码看起来像这样
d = dict.fromkeys(['A','B','C'],[])
d['A'].append('Hello')
然而,结果并非我所期望的。 每个键的值是一个包含一个元素的列表:'Hello'
>>> d
{'A': ['Hello'], 'C': ['Hello'], 'B': ['Hello']}
如果我尝试以下内容,则会产生相同的结果
d.get('A').append('Bye')
我必须做什么操作才能获得这个?
>>> d
{'A': ['Hello'], 'C': [], 'B': []}
有人可以解释我的语法出了什么问题吗?
答案 0 :(得分:5)
您的语法很好,但您一遍又一遍地使用相同的列表。由于列表是可变的,当您append
时,您将'Hello'添加到同一列表中,这恰好在三个地方引用。你可能想要做的是手动创建一个dict:
d = {k:[] for k in ['A', 'B', 'C']}
(以上是Python 2.7或更高版本。对于较旧的Python,您可以使用:dict((k,[]) for k in ['A', 'B', 'C'])
)
答案 1 :(得分:2)
你正在创建一个字典,其所有值都引用与@Aशwiniचhaudhary提到的相同的实例[]
。
您可能想要使用defaultdict
:
In [150]: from collections import defaultdict
In [151]: d = defaultdict(list)
In [152]: d['A'].append('Hello')
In [153]: d
Out[153]: defaultdict(<type 'list'>, {'A': ['Hello']})
In [154]: print d['B']
[]