2016-04-28 5 views
2

私はちょっとしたことがあります。 zipで開始されたタプルキーを持つ辞書が、単一のキーの更新時にすべてのキーを更新するのはなぜですか?

keys = range(8) 

DICT={} 
for k in keys: 
    DICT[k] = [] 
print DICT 
#returns 
#{0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []} 

DICT[1].append('mkay') 
print DICT 
#returns 
#{0: [], 1: ['mkay'], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []} 

しかし、私は違った辞書を初期化する場合は、添付の動作は全く異なっている:あなたが期待するように、このコードは動作し

DICT = dict(zip(keys,[[]]*len(keys))) 
print DICT 
#returns 
#{0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []} 

だから、それは同じに見えます。しかしそれではありません:

DICT[1].append('mkay') 
print DICT 
#returns 
#{0: ['mkay'], 1: ['mkay'], 2: ['mkay'], 3: ['mkay'], 4: ['mkay'], 5: ['mkay'], 6: ['mkay'], 7: ['mkay']} 

ここで何が起こっているのか分かりませんか?私はこれを得たかもしれない他の誰のためにもこれを掲示すると思った。

+1

何も不思議ではありません。 '[]]'に 'len(keys)'を掛け合わせることで、すべてが同じオブジェクトを指すリストのリストを作成しました。 – Kasramvd

+1

http://stackoverflow.com/a/36452923/2201041を参照すると、私にはより明確な回答が得られました。 – JETM

答えて

1

[[]]*len(keys)のため、辞書の各値は同じリストを参照します。それは、 "リストを作成し、それへの参照をlen(keys)回コピーする"と言います。

+0

私は参照してください。だから、 'len(keys)'ポインタは同じリストに行きます。私は 'len(keys)'の別のリストを作成したと仮定しました! – Wapiti

関連する問題