Инициализация списков: какой метод правильнее

Есть два способа инициализации списка (python 3.6):

Инициализация списка -- метод 1

x = [[1,2,3,4]] * 3
print(x)

Output: [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]

Инициализация списка -- метод 2

y = [[1,2,3,4] for _ in range(3)]
print(y)

Output: [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]

Какой метод следует использовать и почему?


Ответы (1 шт):

Автор решения: MBo

Первый метод создаёт один объект, и дублирует ссылку на него. При изменении одного из подсписков будет меняться и содержимое других

a = [[1,2,3,4]] * 3
a[1][1] = 5
print(a)

[[1, 5, 3, 4], [1, 5, 3, 4], [1, 5, 3, 4]]

a = [[1,2,3,4] for i in range(3)]
a[1][1] = 5
print(a)

[[1, 2, 3, 4], [1, 5, 3, 4], [1, 2, 3, 4]]
→ Ссылка