2012-01-26 17 views
3

は私が見えますPythonでコードを書いたように:私はmaplist印刷奇妙なPythonは行動

maplist=[{}]*11 
mylist=[0]*11 
maplist[0]['this']=1 
print maplist 

出力は、次のとおりです。期待

[{'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}] 

は次のとおりです。

[{'this': 1}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}] 

ではなく、リストの最初の要素だけがこのキーをマップ内に持つ必要があります。この問題の原因は何ですか?

+0

:あなたはこのような何かを行うことができます11冊の別々の辞書を作成するには

タグごとのFAQを作成する方法が必要なように思えます。 –

答えて

12

あなたは次のようにします。

maplist=[{}]*11 

あなたは同じ辞書に11個の参照になってしまいます。つまり、ある辞書を変更すると、すべてが変更されたように見えます。そのまま0がスカラーであることから、次の行は結構です、

maplist=[{} for in xrange(11)] 

注:

mylist=[0]*11 
+0

オハイオは初めてこれを見てきました。なぜPythonがそうしているのか、具体的な理由はありますか? –

+0

@ Piyushこれは、*演算子がリストに作用する方法の結果にすぎません。より詳しい説明は、[この回答](http://stackoverflow.com/a/8240157/566644)を参照してください。 –

3

問題は、あなたが入力したときで固定するために

は、とその行を置き換えます

maplist=[{}]*11 

同じdictへの11の参照のリストを作成しています。 1つの辞書だけが作成されます。それは重複として物事をマーキングに加えて、私は始めているどのくらいの頻度我々は同じ質問に微妙な変化を取得...驚くべきことだ

>>> maplist = [{} for i in range(11)] 
>>> maplist[0]['this'] = 1 
>>> maplist 
[{'this': 1}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]