2012-03-02 4 views
0

簡単な質問ですが、これは問題を起こしています。リストに値を割り当てると、IDは

私は2つの変数と関数とすることができる、内部のリストのリストを持って、今、私は別のものを構築したいのx、y、及びその結果、Z、そのリストは

a = [ [[x1,y1,z11], [x1,y2,z12], ...], 
     [[x2,y1,z21], [x2,y2,z22], ...], 
     ... ] 

のように構築されたと言いますこのオブジェクトで、さまざまな機能を、wは言わせて:

b = [[0.0]*len(a[0])]*len(a) 
for i in range(len(a)): 
    for j in range(len(a[0])): 
     c = a[i][j][:2] 
     c.append(w(i,j)) 
     b[i][j] = c 

O:それを行うには、次に

b = [ [[x1,y1,w11], [x1,y2,w12], ...], 
     [[x2,y1,w21], [x2,y2,w22], ...], 
     ... ] 

、私はこれを行いますk。今、私がa[i][j]を求めるとき、私はb[i][j]を得ます。これは私が困惑しているのです。私が端末でこれを試してみると、私は正しいことを得ます。a[i][j]。どんな助け?

+2

に保存することができます。 '私はlen(a)のために:'実行することはありません。私たちにあなたが尋ねる振る舞いを示す実際のコードを表示してください。さもなければ私たちはあなたのバグを見つけることができません –

+0

本当にトリプルネストされたリストを持つ必要はありますか?私は今あなたのエラーを複製しようとしています。 –

+1

また、 'b = [[0.0] * len(a [0])] * len(a)'のようにリストbを初期化する必要はありません。実際には 'b.append()'を使用してください。 –

答えて

4

問題はここにある:

b = [[0.0]*len(a[0])]*len(a) 
# or in two steps 
x = [0.0] * len(a[0]) # one list 
b = [x] * len(a)  # lots of references to that same list 

あなたが作るために必要なもの、新しいリストである:

# makes a new inner list for every m 
b = [[0.0]*len(a[0]) for m in xrange(len(a))] 
+0

あなたが実際に問題を解決することを提案しているのは、私が投稿したコードを再使用していたことですが、うまくいきます。とにかく、これは大丈夫です、ありがとうございます。 – chuse

0

問題はc = a[i][j][:2]はあなたにaの実際のリストへの参照を与えることです。何かを追加すると、aが変更されます。あなたは私たちにあなたが実際に使用しているコードを示さなかった代わりに、ちょうど今c

c = a[i][j][:2] + [ w(i, j) ] 

を書くことは別のリストであり、あなたが安全にb

関連する問題