Понимание списков списков

Возможный дубликат:
Неожиданная функция в списке списков Python
Путаница списка Python

Рассмотрим следующий код:

a = [[]] * 3 a[1].append("foo") 

Я ожидал бы, что значение a станет:

 [[], ["foo"], []] 

вместо этого обновляется каждый элемент a :

 [["foo"], ["foo"], ["foo"]] 

Может кто-нибудь объяснить, почему каждый элемент списка получил обновление вместо определенного элемента ( a[1] )? В моей логике есть что-то принципиально неправильное?

Для чего это стоит, я запускаю Python2.7

2 Solutions collect form web for “Понимание списков списков”

Списки в Python – это объекты, это означает, что когда вы назначаете список другой переменной, изменение либо изменит фактический список, например

 a = [] b = a b.append("hi") print a // a is now ["hi"] 

Когда вы выполняете задание

 a = [[]] * 3 

Это то же самое, что сказать

 inner_list = [] outer_list = [inner_list, inner_list, inner_list] 

Другими словами, все внутренние списки являются одним и тем же объектом. Не разные объекты, как вы думаете.

Чтобы получить эффект, который вы хотите, вы должны сделать:

 outer_list = [] for i in range(0, 3): outer_list.append([]) 

Что создает 3 внутренних списка объектов и помещает их во внешний объект.

Я думаю, вы обнаружите, что происходит, это то, что делает python:

 outer_list = [] inner_list = [] outer_list = [inner_list,inner_list,inner_list] 

или пояснить его более четко, outer_list и внутренний список создаются один раз, а затем inner_list копируется * 3 в outer_list , что означает, что все 3 списка в outer_list фактически являются ссылкой на тот же самый inner_list скопированный 3 раза.

  • Pythonic способ преобразования списка целых чисел в строку разделенных запятыми диапазонов
  • трюк с пустым списком python
  • Передача списка при сохранении оригинала
  • Получите декартовое произведение из серии списков?
  • Удалите все элементы, которые встречаются в одном списке из другого
  • Как получить размер списка
  • Как применить функцию zip к n-list
  • Получить только уникальные элементы из двух списков python
  • Python - лучший язык программирования в мире.