добавление списка в список для создания списка списков вызывает проблему при желании изменить значение с помощью индекса списка списков: python - PullRequest
1 голос
/ 22 июля 2011

Обычно возникает проблема, когда список составляется путем добавления списка в другой список с помощью list.append (). Проблема в том, что весь столбец изменяется на значение, которое вы установили для индекса, который вы задаете. например код здесь

b = [1,1,1]
c = []
c.append(b)
c.append(b)
c.append(b)
c[0][0] = 4

и если вы напечатаете c, вы получите: [[4,1,1] [4,1,1] [4,1,1]] вместо [[4,1,1] [1,1,1] [1,1,1]]

Так что мой вопрос в том, как вы могли бы получить список справа, а не то, что на самом деле происходит.

Ответы [ 2 ]

4 голосов
/ 22 июля 2011

То, что вы заметили, является нормальным и ожидаемым поведением в Python, и любое приличное руководство должно его освещать.

c.append(b)
c.append(b)
c.append(b)

Это добавляет к c три ссылки на список b. Поскольку это один и тот же список, изменение одной ссылки меняет его во всех четырех местах, на которые он ссылается, в том числе, к слову, b.

Если вам не нужно это поведение, скопируйте список.

c.append(b[:])
c.append(b[:])
c.append(b[:])
1 голос
/ 22 июля 2011

Создайте новую копию списка каждый раз, когда вы добавляете его:

b = [1,1,1]
c = []
c.append(list(b))
c.append(list(b))
c.append(list(b))
c[0][0] = 4

Причина, по которой у вас возникают проблемы, заключается в том, что списки хранятся в виде ссылки на фактический объект списка - и, следовательно, ваша версия c имеет 3 копии одной и той же ссылки, причем все они указывают на тот же фактический [1,1,1] объект. При использовании функции list() создаются новые копии, так что ссылки указывают на отдельные объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...