我不确定这是一个错误还是一个功能。 我有一个用空列表初始化的字典。
让我们说
keys =['one','two','three']
sets = dict.fromkeys(keys,[])
我观察到的是,如果您将任何项目附加到任何列表中,则会修改所有列表。
sets = dict.fromkeys(['one','two','three'],[])
sets['one'].append(1)
设置
{'three': [1],'two': [1], 'one': [1]}
但是当我手动使用循环时,
for key in keys:
sets[key] = []
sets['one'].append(1)
集
{'three': [], 'two': [], 'one': [1]}
我认为第二种行为应该是默认行为。
答案 0 :(得分:10)
这就是Python中的工作方式。
以这种方式使用fromkeys()
时,最后会有三个对同一列表的引用。当您更改一个列表时,所有三个列表都会更改。
这里也可以看到相同的行为:
In [2]: l = [[]] * 3
In [3]: l
Out[3]: [[], [], []]
In [4]: l[0].append('one')
In [5]: l
Out[5]: [['one'], ['one'], ['one']]
同样,这三个列表实际上是对同一列表的三个引用:
In [6]: map(id, l)
Out[6]: [18459824, 18459824, 18459824]
(注意他们如何拥有相同的身份证)
答案 1 :(得分:5)
其他答案涵盖了“为什么”,所以这就是方法。
您应该使用理解来创建所需的词典:
>>> keys = ['one','two','three']
>>> sets = { x: [] for x in keys }
>>> sets['one'].append(1)
>>> sets
{'three': [], 'two': [], 'one': [1]}
对于Python 2.6及更低版本,字典理解可以替换为:
>>> sets = dict( ((x,[]) for x in keys) )