2011-10-12 14 views
25

私はPythonで奇妙な動作であると思ったことがありました。可能であれば、それを説明することをお勧めします。Pythonの2Dリストへの追加

私は空の2Dリスト

listy = [[]]*3 

print listy 

[[], [], []] 

私が期待するよう、次の作品を作成しました:

listy[1] = [1,2]利回り[[], [1,2], []]

listy[1].append(3)利回りしかし[[], [1,2,3], []]

を、ときに私空のリストの1つに追加すると、pythonはすべてのサブリストに次のように追加されます。

listy[2].append(1)[[1], [1,2,3], [1]]

誰でもこの現象が発生する理由を説明できますか?

+4

月に何回何回尋ねられるのだろうか。確かに、これはPythonに関するよくある質問です(Stack Overflowだけでなく)。公式のPythonのドキュメントのFAQから:[多次元リストを作成するにはどうすればいいですか?](http://docs.python.org/faq/programming.html#how-do-i-create-a-multidimensional-list) –

答えて

44

異なるの空リストを作成していません。 の1つをの空のリストに作成してから、と同じの空リストに3つの参照を含む新しいリストを作成しました。代わりに、このコード問題の使用を修正するには:

>>> listy = [[] for i in range(3)] 
>>> listy[1] = [1,2] 
>>> listy 
[[], [1, 2], []] 
>>> listy[1].append(3) 
>>> listy 
[[], [1, 2, 3], []] 
>>> listy[2].append(1) 
>>> listy 
[[], [1, 2, 3], [1]] 
+0

+1徹底的な説明 – heltonbiker

+0

これは非常に意味があります。ありがとう。 –

12

[[]]*3[[], [], []]と同じではありません。

listy = [[] for i in range(3)] 

今あなたの例のコードを実行すると、あなたはおそらく期待される結果なります。

あなたは言い換えれば

a = [] 
listy = [a, a, a] 

を言っただろうかのように、すべての3つのリストの参照は、同じリストのインスタンスを参照しています。

関連する問題