2016-05-21 14 views
-1

私はリストのリストをpythonで持っています。リスト内でのリストの索引付けは

z=[[0]*6]*7 

すべての要素が0である。しかし、今、私は例えば

z[0][0]=2 

リスト内の個々の要素を変更したい場合、これが最初のリストの最初の要素を変更する必要があるため。しかし、実際にはすべての要素の最初の要素が変更されます。これは私にとってとても非合理です。 誰かが助けることができます。

[2, 0, 0, 0, 0, 0], 
[2, 0, 0, 0, 0, 0], 
[2, 0, 0, 0, 0, 0], 
[2, 0, 0, 0, 0, 0], 
[2, 0, 0, 0, 0, 0], 
[2, 0, 0, 0, 0, 0]] 

答えて

1

これはPythonの古典的な「プログラマーの罠」です。

l = [ 0 ] * 6 

ここ同じ Pythonオブジェクト、数値定数0に6回参照を含むリストを作成します。今

他の目的、const 1オブジェクトへの参照によってconst 0オブジェクトへの最初の参照を置き換えます

l[0] = 1 

を設定します。

それでは、

z=[[0]*6]*7 

を見てみましょう。この最初はconst 0オブジェクトへ6つの参照を含むリストを作成し、そのシングル 6要素のリストへの7つの参照を含むリストを作成します。

さて、

z[0] 

はあなただけですべての6つの他の要素として同じであるzから最初の要素を、提供します。

証明:

print id(z[0]) == id(z[1]) 

異なるオブジェクトが異なるIDを持っています。

あなたは実際には異なるリストのリストを作成することはありませんでしたが、すべて同じリストを作成しました。

あなたが実際には異なるサブリストを作成し、

z = [ [0]*6 for _ in range(7) ] 

ような何かを行うことによって1にそれらを置くことができる

しかし、私はあなたが実際に行列を使用する場合があります感覚を得る - それは本当にケースだ場合、numpyさんndarray次の理由によるものです。

import numpy 
z = numpy.ndarray((7,6)) 

実際には、42個の数値要素で構成される行列が得られます。

関連する問題