2D-лист имеет странное его, чтобы попытаться изменить одно значение [дубликат

StackOverflow https://stackoverflow.com/questions/2739552

  •  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 раз одного объекта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top