首页 > 解决方案 > 分配值时二维数组的值很好,但是当我在 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()

它是原始输出的最后一行,在新输出中不断重复。

我运行这个程序时的输出

标签: pythondebuggingmultidimensional-arrayoutput

解决方案


错误是在您的 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)]

在您的打印语句中,数组的第一次打印是在每次修改后完成的,因此它会打印正确的最新值,但也会更新早期分配的值。这是第二次打印显示重复值的原因。


推荐阅读