2D-лист имеет странное его, чтобы попытаться изменить одно значение [дубликат
-
02-10-2019 - |
Вопрос
Возможный дубликат:
Неожиданная функция в списке списков Python
Поэтому я относительно новичок в Python, и у меня проблемы с работами с двумя списками.
Вот мой код:
data = [[None]*5]*5
data[0][0] = 'Cell A1'
print data
А вот выход (отформатирован для читабельности):
[['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None]]
Почему каждая строка назначается значение?
Решение
Это делает список с пятью ссылками на такой же список:
data = [[None]*5]*5
Используйте что-то вроде этого вместо этого, что создает пять отдельных списков:
>>> data = [[None]*5 for _ in range(5)]
Теперь это делает то, что вы ожидаете:
>>> data[0][0] = 'Cell A1'
>>> print data
[['Cell A1', None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None]]
Другие советы
Как то Справка библиотеки Python для типов последовательности, который включает в себя списки, говорит
Обратите внимание, что копии мелкие; Вложенные структуры не копируются. Это часто преследует новые программисты Python; рассмотреть возможность:
>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]
Это произошло, так это то, что [[]] - это один список элементов, содержащий пустой список, поэтому все три элемента [[]] * 3 являются (указатели на) этот единственный пустой список. Изменение любого из элементов списков изменяет этот единственный список.
Вы можете создать список разных списков таким образом:
>>> lists = [[] for i in range(3)]
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
[[3], [5], [7]]
В Python каждая переменная является объектом, и поэтому ссылка. Сначала вы создали массив из 5 NONES, а затем вы создаете массив в 5 раз одного объекта.