← Все вопросы

Почему [[0]*3]*3 создаёт «связанные» строки матрицы?

Задан 14 месяцев назад1.3к просмотров3 ответа
26

Сделал матрицу m = [[0]*3]*3, меняю m[0][0] = 1, а меняется во всех строках сразу: [[1,0,0],[1,0,0],[1,0,0]]. Почему так и как правильно?

3 ответа

41
✓ Принятый ответ — помог автору

Потому что [[0]*3] * 3 создаёт один внутренний список и копирует на него три ссылки, а не три разных списка. Внешний список — это три указателя на один и тот же объект. Меняешь через один — «меняется во всех», потому что это один и тот же список.

Правильно — генератором, чтобы на каждой итерации создавался новый список:

m = [[0] * 3 for _ in range(3)]
m[0][0] = 1
# [[1, 0, 0], [0, 0, 0], [0, 0, 0]]  ✅

Ключевая разница: * 3 копирует ссылку, а list comprehension выполняет [0]*3 заново на каждой итерации — получаются независимые строки.

Тимур Осипов автор: то что надо, принято · 14 месяцев назад
Егор Зробко месяц мучился с этим багом, спасибо огромное 🙏 · 13 месяцев назад
13

Запомни как мантру: для матриц всегда [[0]*cols for _ in range(rows)], никогда не умножай внешний список.

-6

Это потому что числа в питоне иммутабельны.

Руслан Петров нет, дело не в числах, а в том что вложенный список один и тот же по ссылке · 13 месяцев назад

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект