python - 分配值时二维数组的值很好,但是当我在 python 中再次打印它时会发生变化
问题描述
我正在尝试按照在线指南在 python 中创建一个 ASCII 照片生成器,所以我所做的是将图像日期转换为 RGB 元组并将它们放入二维数组中。我通过取所有 RGB 值的平均值将此二维数组转换为亮度数组。但是,与在分配值时打印它相比,当我再次打印它时,这个亮度数组显示出不同的输出。
最初它显示正确的输出,但是当我再次打印它时,它在矩阵的所有行中显示相同的值。
from PIL import Image
import math
im = Image.open("smallimage.jpg")
print(im.size)
rows,cols = (im.size[0],im.size[1])
print(rows,cols)
arr = [[0]*cols]*rows
arr = list(im.getdata())
arr = [arr[i*cols: (i+1)*cols] for i in range(rows)]
brightness_matrix = [[0]*cols]*rows
for row in range(rows):
for col in range(cols):
brightness_matrix[row][col] = math.floor((arr[row][col][0] + arr[row][col][1] + arr[row][col][2])/3)
print(brightness_matrix[row][col],end = " ")
print()
for row in range(rows):
for col in range(cols):
print(brightness_matrix[row][col],end=" ")
print()
它是原始输出的最后一行,在新输出中不断重复。
解决方案
错误是在您的 2D 列表初始化期间 - arr = [[0]*cols]*rows
。这将导致 [0,0,...] 的内部列表重复行数次,因为它只是复制内部列表的地址。请参见下面的示例。每次修改一行中的任何元素时,每行中的所有元素都会更新。
>>> arr = [[0]*2]*3
>>> arr[0][0] = 1
>>> arr
[[1, 0], [1, 0], [1, 0]]
建议代码:arr = [ [0]*cols for i in range(rows)]
在您的打印语句中,数组的第一次打印是在每次修改后完成的,因此它会打印正确的最新值,但也会更新早期分配的值。这是第二次打印显示重复值的原因。