← Все вопросы
Почему [[0]*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 месяцев назад
Ваш ответ
Войдите, чтобы ответить на вопрос.