Подробное объяснение
1️⃣ Выражение [0] * 3 создаёт список [0, 0, 0] — один объект в памяти.
2️⃣ Выражение [[0, 0, 0]] * 3 создаёт три ссылки на этот же объект, а не три независимых списка.
3️⃣ Переменная m содержит [[0,0,0] ref, [0,0,0] ref, [0,0,0] ref]. Все ref → один объект.
4️⃣ m[0][0] = 1 обращается к первой ссылке, находит тот же список и меняет его первый элемент.
5️⃣ Поскольку все три строки ссылаются на один список, изменение видно во всех строках.
6️⃣ Вывод: [[1, 0, 0], [1, 0, 0], [1, 0, 0]].
Почему это важно:
Классический баг при создании игровых полей, таблиц и матриц. Чтобы сделать независимые строки, используйте list comprehension: [[0]*3 for _ in range(3)] — тогда каждая строка будет своим объектом.
Post #4737
750
- ✍ 3