Как сделать список списков python?
как сделать матрицу на 7 строк чтобы изменение одной клетки не меняло остальные, незнаю почему после умножения списка все строки связаны, пример из урока вроде такой же но.
Ваш вопрос
как сделать матрицу на 7 строк чтобы изменение одной клетки не меняло остальные, незнаю почему после умножения списка все строки связаны, пример из урока вроде такой же но.
Проверьте способ создания:
• Для независимых строк: matrix = [[0] * cols for _ in range(rows)].
• Не используйте [[0] * cols] * rows, если строки потом изменяются: это повторяет ссылки на один внутренний список.
• Обращайтесь к клетке как matrix[row][col].
Например, после создания через включение изменение matrix[0][0] не затронет остальные строки. Для вложенных изменяемых объектов внутри клеток нужна отдельная проверка копирования.
Пока нет премиум-вопросов в подборке
Не нашли то, что искали?
Задайте свой вопрос
Лучший ответ
v4-flash
v4-flash
Как сделать список списков python?
Создавайте каждую внутреннюю строку отдельно:
matrix = [[0] * cols for _ in range(rows)]. Тогда изменение одной клетки не будет автоматически повторяться в остальных строках. Причина вашей ошибки — умножение внешнего списка копирует ссылки, а не создаёт независимые внутренние списки.Например, запись
bad = [[0, 0]] * 3создаёт внешний список с тремя ссылками на один и тот же объект[0, 0]. Когда выполняетсяbad[0][0] = 9, этот общий объект меняется. Поэтому при выводе число появится в каждой строке, хотя присваивание было только одно.Вариант
good = [[0, 0] for _ in range(3)]ведёт себя иначе. Выражение внутреннего списка выполняется заново при каждом проходе, поэтому получаются отдельные строки. Послеgood[0][0] = 9первая строка изменится, а остальные останутся прежними.Для ваших семи строк можно задать
rows = 7и нужное число столбцов вcols, затем применить включение. Нули допустимо повторять через[0] * cols, поскольку числа неизменяемы. Но если каждая клетка должна содержать отдельный список или словарь, такой способ внутри строки тоже потребует пересмотра: создавайте отдельный объект для каждой клетки.Обращение
matrix[i][j]сначала выбирает внутренний список с индексомi, затем элементjв нём. Индексы начинаются с нуля. Если данные уже пришли как список строк, не нужно заново умножать их ради матрицы: проверьте, независимы ли вложенные объекты и одинаково ли их размеры соответствуют задаче. Копия внешнего списка черезcopy()сама по себе не делает глубоких копий внутренних строк.