Возможный дубликат:
Неожиданная функция в списке Python списковТаким образом, я относительно плохо знаком с Python, и я испытываю затруднения при работе с 2D Списками.
Вот мой код:
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-кратным одним и тем же объектом.