Выбор ответа Middle Типы, изменяемость и сравнение спрашивают часто обновлено

Ловушка [[0]*3]*3

Вопрос

Что будет в grid после выполнения?

grid = [[0] * 3] * 3
grid[0][0] = 1

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: [[1, 0, 0], [1, 0, 0], [1, 0, 0]]. Умножение списка копирует ссылки, а не объекты. [[0] 3] 3 даёт внешний список из трёх ссылок на один и тот же внутренний список, поэтому изменение grid[0][0] видно во всех строках.

Варианты ответа

  1. [[1, 0, 0], [0, 0, 0], [0, 0, 0]]
  2. TypeError: список нельзя умножать на число
  3. [[1, 0, 0], [1, 0, 0], [1, 0, 0]]правильный ответ
  4. [[1, 1, 1], [0, 0, 0], [0, 0, 0]]

Разбор

Умножение списка копирует ссылки, а не объекты. [[0] * 3] * 3 даёт внешний список из трёх ссылок на один и тот же внутренний список, поэтому изменение grid[0][0] видно во всех строках. Правильно: [[0] * 3 for _ in range(3)]. Умножение списка на число разрешено, а первый вариант был бы верен только для независимых строк.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме