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

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

Interesting Posts

Фильтрация даты на оси x с помощью matplotlib Python

Как удалить / удалить папку, которая не пуста с Python?

matplotlib: создание двух (уложенных) подлодок с осью SHARED X, но значения SEPARATE Y

Какое исключение я должен поднимать по неправильным / незаконным комбинациям аргументов в Python?

Как сохранить имена столбцов, начинающиеся с минуса при использовании numpy.genfromtxt?

Как сделать столбцы массива numpy суммой до 1

Группировать по нескольким клавишам и суммировать / средние значения списка словарей

Режимы работы открытых файлов Python

Приложение Python ничего не делает

Как заменить контур (прямоугольник) на изображении новым изображением с помощью Python?

Является ли плохая форма вызовом classmethod как метод из экземпляра?

Список установленных пакетов сайта python?

Модульное тестирование: как я могу динамически импортировать тестовые классы и запускать их?

Get: TypeError: объект dict_values ​​не поддерживает индексирование при использовании python 3.2.3

зависимость модуля cx_freeze

Python - лучший язык программирования в мире.