Добавление в 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]]
.
Может ли кто-нибудь объяснить мне, почему это происходит?
Ответы
Ответ 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]
Другими словами, все три списка ссылок относятся к одному экземпляру списка.