定義した関数の戻り値は、リストの最初の()インデックスThreeByThree
に割り当てると、変化して1ずつ加算されます。ただし、連続した割り当ては有効です。私の印刷ステートメントの結果をご覧くださいnewImage
[0][0]
def boxBlur(image):
lenVert = len(image)
lenHorz = len(image[0])
newImage = [[0] * (lenHorz - 2)] * (lenVert - 2)
def ThreeByThree(a,b,image):
k = 0
total = 0
for i in range(a, a + 3):
for j in range(b, b + 3):
k = image[i][j]
total += k
return int(total / 9)
for i in range(0, lenVert - 2):
for j in range(0, lenHorz - 2):
print(ThreeByThree(i, j, image))
newImage[i][j] = ThreeByThree(i, j, image) # This is where the assignment goes wrong
return newImage
image = [[7, 4, 0, 1],
[5, 6, 2, 2],
[6, 10, 7, 8],
[1, 4, 2, 0]]
print(boxBlur(image))
期待される出力:
5
4
4
4
[[5, 4], [4, 4]]
出力:
5
4
4
4
[[4, 4], [4, 4]]
問題はnewImage
、*
演算子を使用して作成しているリストが、相互に参照するサブリストを作成していることです。その結果、相互に参照するため、実際にnewImage[0][0]
割り当てるときの値を変更しますnewImage[1][0]
。例えば:
newImage = [[0] * 2] * 2
newImage[0][0] = 5
print(newImage)
# [[5, 0], [5, 0]]
newImage[1][0] = 4
print(newImage)
# [[4, 0], [4, 0]]
代わりに、サブリストが相互に参照しないように初期リストを作成します(*
サブリスト内の整数値は不変であるため、演算子を使用して乗算できます)。
newImage = [[0] * (lenHorz - 2) for _ in range(lenVert - 2)]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加