почему ris[q][w] = "*" меняет весь столбик, а не одно значение?

n = int(input())
a = int(input())
b = int(input())

ris = [["."] * n] * n
dim = []
for j in range(a,b + 1):
    dim.append(j)
center = [int((((n - 1)/2) + 1)),int((((n - 1)/2) + 1))]



for q in range(n):
    dis = 0
    for w in range(n):
        dis = (abs((w + 1) - center[0])) + (abs((q + 1) - center[1]))
        if dis in dim:
            ris[q][w] = "*"

for e in range(n):
    print(ris[e])

Данный код почему-то ris[q][w] = "*" меняет весь столбик, а не одно значение массива. Вся суть задачи, что он должен закрашивать точки, которые лежат на расстоянии в {dim}, и благодаря этому получается ромб, в отлаживании кода он просто закрашивает весь столб.


Ответы (2 шт):

Автор решения: Zhihar

потому что ссылки списков и все такое

когда вы делаете "список * число", то получаете список все элементы которого ссылаются на первоначальный список

сделайте так:

ris = [["." for i in range(n)] for j in range(n)]

P.S.

а вообще весь ваш код можно свернуть в:

print(*[[".*"[a <= abs(w - (n - 1) // 2) + abs(q - (n - 1) // 2) <= b] for w in range(n)] for q in range(n)], sep='\n')
→ Ссылка
Автор решения: SergFSM

вам надо заменить

ris = [["."] * n] * n

на:

ris = [["."] * n for _ in range(n)] 
→ Ссылка