2d数组的值在赋值时很好,但当我在python中再次打印时会发生变化



我正试图按照在线指南在python中创建一个ASCII照片生成器,所以我所做的是将图像日期转换为RGB元组,并将它们放在一个2d数组中。我通过取所有RGB值的平均值将这个2d阵列转换为亮度阵列。但是,当我再次打印它时,这个亮度阵列显示的输出与在指定值时打印它不同。

最初它显示正确的输出,但当我再次打印时,它在矩阵的所有行中显示相同的值。

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)]

在打印语句中,数组的第一次打印是在每次修改后进行的,因此它既打印正确的最新值,也更新先前分配的值。这就是第二次打印显示重复值的原因。

相关内容

最新更新