2015-11-26 2 views
-2

Я пытаюсь изменить одну ячейку в одном вложенном списке и получить ячейку измененной во всех вложенных списках.ошибка в инсталляции вложенных списков в python

пример:

>>> temp_list = [['a']*2]*3 
>>> temp_list 
[['a', 'a'], ['a', 'a'], ['a', 'a']] 
>>> temp_list[2][0] = 'b' 
>>> temp_list 
[['b', 'a'], ['b', 'a'], ['b', 'a']] 
>>> 

спасибо заранее!

+0

Это потому, что [ 'а'] * 2] сделать список [адрес 'а', адрес 'а'] вместо [данных 'а', данные «а «]. Когда вы выполняли назначение, значение этого адреса обновлялось вместо данных. –

+0

Это не ошибка. Список - это изменяемый тип последовательности. Проверьте этот URL: https://docs.python.org/2/library/functions.html#list –

+0

Еще одна интересная ссылка, чтобы понять, что происходит: https://en.wikibooks.org/wiki/Python_Programming/ списки # List_creation_shortcuts – Antwane

ответ

2

Я знаю, это звучит неправильно, но ...

Это не ошибка, это особенность.

>>> [id(x) for x in temp_list] 
[4473545216, 4473545216, 4473545216] 

Как вы можете видеть, все они имеют ту же ссылку. Поэтому вам нужно создать копию списка.

0

В 2.7 Я получаю такое же поведение. Каждый экземпляр, являющийся результатом расширения *, относится к одной и той же переменной.

>>> temp_list = [['a']*2]*3 
>>> temp_list 
[['a', 'a'], ['a', 'a'], ['a', 'a']] 
>>> temp_list[2][0] = 'b' 
>>> temp_list 
[['b', 'a'], ['b', 'a'], ['b', 'a']] 
>>> temp_list[1][0] = 'c' 
>>> temp_list 
[['c', 'a'], ['c', 'a'], ['c', 'a']] 
>>> temp_list[1][1] = 'x' 
>>> temp_list 
[['c', 'x'], ['c', 'x'], ['c', 'x']] 

См: Python initializing a list of lists

Смежные вопросы