2012-01-05 7 views
9

可能な重複を作成:
Python 2D list has weird behavor when trying to modify a single valuePythonのリスト内包表記:2次元配列

人々、

2次の文が同じである場合、私は疑問に思って?

a = [[0]*3]*3 
b = [[0]*3 for i in range(3)] 

結果は同じです。しかし、ある方法は他より良いでしょうか?ここでの違いは何ですか?

ご協力いただきありがとうございます。

nos

+4

この正確なトピックをカバーする数千人の質問は、文字通りあります... – JBernardo

答えて

17

彼らは最初

>>> a[1][2] = 5 
>>> a 
>>> [[0, 0, 5], [0, 0, 5], [0, 0, 5]] 


>>> b[1][2] = 5 
>>> b 
>>> [[0, 0, 0], [0, 0, 5], [0, 0, 0]] 

同じじゃありません単一の内部配列へのポインタの外部配列を作成し、第2の配列は実際には3つの別々の配列を作成します。

+1

私は* exact *同じことをタイプしていました。あなたに+1してください。 – Makoto

+0

ええ、最初の配列では、3つの配列はすべて同じオブジェクトです。 [[]] * 5の代わりに[1] * 5の代わりに整数を使用すると、各位置に新しい整数が使用されます –

+3

これらはPython配列ではありません...これらはPythonリストです。 – joaquin

7

いいえ、そうではありません。
あなたは3つの同一のリスト、同じ参照(のリスト)を持っている最初のものでは、第二に、あなたは、3つの異なるリストを持つ

>>> a = [[0]*3]*3 
>>> a 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 
>>> a[0][0]=1 

>>> a 
[[1, 0, 0], [1, 0, 0], [1, 0, 0]] 


>>> b = [[0]*3 for i in range(3)] 
>>> b 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 
>>> b[0][0] = 1 

>>> b 
[[1, 0, 0], [0, 0, 0], [0, 0, 0]] 
+0

+1。 'a [0] .append(" foo ")'を試してください。 –

0

hereは、Pythonのドキュメントで説明したように、それは、深いコピー対浅いコピーの古典的なケースだ:)