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

2番目の動作がデフォルトであると思います。

4

2 に答える 2

10

これが Python での動作です。

この方法で使用するfromkeys()と、同じリストへの 3 つの参照で終わります。1 つのリストを変更すると、3 つすべてが変更されたように見えます。

ここでも同じ動作が見られます。

In [2]: l = [[]] * 3

In [3]: l
Out[3]: [[], [], []]

In [4]: l[0].append('one')

In [5]: l
Out[5]: [['one'], ['one'], ['one']]

繰り返しますが、3 つのリストは実際には同じリストへの 3 つの参照です。

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

Python 2.6以下の場合、辞書の理解は次のように置き換えることができます。

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