Значение 2d-массива подходит при присвоении значений, но изменяется, когда я снова печатаю его в python - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь создать генератор фотографий ASCII в python, следуя онлайн-руководству, поэтому я преобразовал дату изображения в кортежи RGB и поместил их в массив 2d. Я преобразовал этот двумерный массив в массив яркости, взяв среднее значение всех значений 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()

Это последняя строка исходного вывода, которая продолжает повторяться в новом выводе.

Вывод, когда я запускаю эту программу

1 Ответ

0 голосов
/ 03 августа 2020

Ошибка при инициализации вашего 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)]

В ваших операторах печати выполняется первая печать массива выполняется после каждого изменения, поэтому печатаются правильные последние значения, но также обновляются ранее назначенные значения. Это причина того, что второй отпечаток показывает повторяющиеся значения.

...