Подтвердить что ты не робот

Добавление в 2D-списки в Python

Я столкнулся с тем, что, по моему мнению, является странным поведением на Python, и я хотел бы, чтобы кто-то объяснил это, если это возможно.

Я создал пустой 2D-список

listy = [[]]*3

print listy

[[], [], []]

Следующее работает так, как я ожидал:

listy[1] = [1,2] дает [[], [1,2], []]

listy[1].append(3) дает [[], [1,2,3], []]

Однако, когда я присоединяюсь к одному из пустых списков, python присоединяется ко всем подспискам следующим образом:

listy[2].append(1) дает [[1], [1,2,3], [1]].

Может ли кто-нибудь объяснить мне, почему это происходит?

4b9b3361

Ответ 1

Вы не создали три разных пустых списка. Вы создали один пустой список, а затем создали новый список с тремя ссылками на тот же пустой список. Чтобы исправить эту проблему, используйте этот код:

listy = [[] for i in range(3)]

Запуск кода примера теперь дает ожидаемый результат:

>>> listy = [[] for i in range(3)]
>>> listy[1] = [1,2]
>>> listy
[[], [1, 2], []]
>>> listy[1].append(3)
>>> listy
[[], [1, 2, 3], []]
>>> listy[2].append(1)
>>> listy
[[], [1, 2, 3], [1]]

Ответ 2

[[]]*3 не совпадает с [[], [], []].

Как будто вы сказали

a = []
listy = [a, a, a]

Другими словами, все три списка ссылок относятся к одному экземпляру списка.