5

我不确定这是错误还是功能。我有一本要用空列表初始化的字典。

让我们说

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]}

我认为第二种行为应该是默认行为。

4

2 回答 2

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]

(注意他们如何拥有相同的 id)

于 2012-05-01T16:54:45.450 回答
5

其他答案涵盖了“为什么”,这就是方法。

您应该使用理解来创建所需的字典:

>>> keys = ['one','two','three']
>>> sets = { x: [] for x in keys }
>>> sets['one'].append(1)
>>> sets
{'three': [], 'two': [], 'one': [1]}

For Python 2.6 and below, the dictionary comprehension can be replaced with:

>>> sets = dict( ((x,[]) for x in keys) )
于 2012-05-01T17:01:08.333 回答