Можно создать дубликат:
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 ']]?
Можно создать дубликат:
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 ']]?
Это лучше всего объясняется шаг за шагом:
>>> 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 добавляют число к каждому из элементов списка.
Я знаю, что это заманчиво, но уже есть 50 хороших ответов на этот вопрос , Просто свяжите дубликат в комментарии и/или отметьте его как дубликат, пока у вас не будет достаточного количества голосов для голосования. – agf
Оператор *, действующий в списках, производит мелкие копии - то есть. – sashab
Этот вопрос буквально задается один раз в день ... Проблема заключается в том, что вы не можете найти решение, если вы уже не знаете, что происходит. –
, чтобы запретить такое поведение, лучше создать список списков, используя следующий синтаксис. >>> x = [[] for _ in range (3)] –