2017-02-24 8 views
0

私は与えられた画像に平均フィルタリングを行うためにこのコードを書いています。 それでは、まず2-d配列を初期化します。しかし、特定のセルに値を代入しようとすると、実際に値が列全体に割り当てられます。以下を参照してください:pythonの多次元配列の乗法の振る舞い

def boxBlur(image):  
    height = len(image) 
    width = len(image[0]) 
    result = [[0]*(width-2)]*(height-2) 
    for i in range(height-2): 
     for j in range(width-2):       
      mysum = image[i][j] + image[i][j+1] + image[i][j+2] + image[i+1][j] + image[i+1][j+1] + image[i+1][j+2] + image[i+2][j] + image[i+2][j+1] + image[i+2][j+2]    
      result[i][j] = mysum/9 
      print result   

boxBlur([[7,4,0,1], 
[5,6,2,2], 
[6,10,7,8], 
[1,4,2,0]]) 

出力のようである:

[[5, 0], [5, 0]] 
[[5, 4], [5, 4]] 
[[4, 4], [4, 4]] 
[[4, 4], [4, 4]] 

誰もがこの行動の背後に正確に何を説明することはできますか?

+0

'result = [[0] *(width-2)] *(height-2)'すべての内部リストは同じであることに注意してください。 – PeterE

+0

「結果」を初期化したら、なぜ修正されないのですか? –

+0

これらは配列ではなく*リスト*です。 –

答えて

0

配列 '乗算'は、乗算しているものへの参照をコピーしている、つまり、生成された配列の各要素が同じ実際のインスタンスを指しています。したがって、1つを変更すると、すべての要素が変更されます。

+0

ありがとう! 「参照のコピー」は現場にあります。 –