задача на матрицы

Задача: На вход программе подаются два натуральных числа nn и mm, каждое на отдельной строке — количество строк и столбцов в матрице. Далее вводятся сами элементы матрицы — слова, каждое на отдельной строке; подряд идут элементы сначала первой строки, затем второй, и т.д.

Напишите программу, которая сначала считывает элементы матрицы один за другим, затем выводит их в виде матрицы.

Вводные данные:

4
2
и
швец
и
жнец
и
на
дуде
игрец

Должен вывести:

и швец
и жнец
и на
дуде игрец

код:

rows, cols = int(input()), int(input())
matrix = []
temp = []
for i in range(rows):
    for j in range(cols):
        temp.append(input())
    matrix.append(temp)
    temp.clear()
for i in matrix:
    print(*i)

И так вопрос, почему после очистки temp у меня очищяется matrix?


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

Автор решения: Сергей Махнёв

Ссылка на такую же проблему с решением

Если в кратце, то метод append не просто добавляет элемент в конец списка, а создает ссылку на нее. Вы методом clear удаляете то, на что ссылается ваша matrix. Ваш код будет работать, если изменить на это:

rows, cols = int(input("vvedite1")), int(input("vvedite2"))
matrix = []
temp = []
for i in range(rows):
    for j in range(cols):
        temp.append(input('vvedite'))
    matrix.append(temp[:]) // изменения здесь
    temp.clear()
for i in matrix:
    print(i)
→ Ссылка
Автор решения: n1tr0xs

Как и сказал @Сергей Махнёв, все дело в том, что в matrix добавляется ссылка на массив temp. Хочу лишь предложить несколько "сокращений" решения.

rows, cols = int(input()), int(input())
matrix = []
for i in range(rows):
    matrix.append([])
    for j in range(cols):
        matrix[i].append(input())        
for i in matrix:
    print(*i)

rows, cols = int(input()), int(input())
matrix = []
for i in range(rows):
    matrix.append([input() for j in range(cols)])
for i in matrix:
    print(*i)

rows, cols = int(input()), int(input())
matrix = [[input() for j in range(cols)] for i in range(rows)]
for i in matrix:
    print(*i)
→ Ссылка
Автор решения: Иван Текин

Да я понимаю, что методом append добавляются ссылки на элементы а потом они удаляются но я категорически не понимаю почему тогда этот код работает правильно

rows, cols = int(input()), int(input())
matrix = []
for i in range(rows):
    temp = []
    for j in range(cols):
        temp.append(input())
    matrix.append(temp)
for i in matrix:
    print(*i)
→ Ссылка