2D список имеет странный behavor при попытке изменить единственное значение [дубликат]

Возможный дубликат:
Неожиданная функция в списке 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]]

Почему каждая строка становится присвоенной значение?

50
задан zeet 23 February 2018 в 22:19
поделиться

3 ответа

Это создает список с пятью ссылками на тот же список:

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]]
73
ответ дан 7 November 2019 в 10:55
поделиться

В справочнике библиотеки 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]]
15
ответ дан 7 November 2019 в 10:55
поделиться

В Python каждая переменная является объектом, то есть ссылкой. Сначала вы создали массив из 5 Nones, а затем вы построили массив с 5-кратным одним и тем же объектом.

2
ответ дан 7 November 2019 в 10:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: