2012-03-31 4 views
-1

Можно создать дубликат:
Python list append behaviorPython вложенные списки

Почему этот код:

x = [[]]*3 
x[0].append('a') 
x[1].append('b') 
x[2].append('c') 
x[0]=['d'] 

print x 

печать [[ 'd'], [ 'а', ' b ',' c '], [' a ',' b ',' c ']]?

+1

Этот вопрос буквально задается один раз в день ... Проблема заключается в том, что вы не можете найти решение, если вы уже не знаете, что происходит. –

+0

, чтобы запретить такое поведение, лучше создать список списков, используя следующий синтаксис. >>> x = [[] for _ in range (3)] –

ответ

5

Это лучше всего объясняется шаг за шагом:

 
>>> x = [[]]*3 
>>> x 
[[], [], []] 
>>> x[0].append('a') 
>>> x 
[['a'], ['a'], ['a']] 
>>> x[1].append('b') 
>>> x 
[['a', 'b'], ['a', 'b'], ['a', 'b']] 
>>> x[2].append('c') 
>>> x 
[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']] 
>>> x[0]=['d'] 
>>> x 
[['d'], ['a', 'b', 'c'], ['a', 'b', 'c']] 

Первый оператор создает список с тремя ссылками на тот же элемент в нем. Поэтому, когда вы изменяете первый элемент, вы также изменяете второй и третий элементы. Следовательно, инструкции append добавляют число к каждому из элементов списка.

+0

Я знаю, что это заманчиво, но уже есть 50 хороших ответов на этот вопрос , Просто свяжите дубликат в комментарии и/или отметьте его как дубликат, пока у вас не будет достаточного количества голосов для голосования. – agf

+0

Оператор *, действующий в списках, производит мелкие копии - то есть. – sashab

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

  • Нет связанных вопросов^_^