Как добавить несколько версий списка (то есть я обновляю список) в список, при этом все списки в списке не должны быть одинаковыми? [Дубликат]

1

У меня проблемы с получением результата, который я хочу. Я хочу создать список и иметь первый элемент нового списка в этом первоначальном списке. Затем я хочу изменить первый список, и новая измененная версия этого списка будет вторым элементом нового списка. Прямо сейчас это выдает [[2,3,4,5,5], [2,3,4,5,5]]. Как мне изменить его так, чтобы выход был [[1,2,3,4,5], [2,3,4,5,5]]?

noChange = [1,2,3,4,5]
lotsOfLists = []

lotsOfLists += [noChange]

for i in range(4):
    noChange[i] += 1
lotsOfLists += [noChange] 

print(lotsOfLists) # current output: [[2, 3, 4, 5, 5], [2, 3, 4, 5, 5]]
# WANT: [[1,2,3,4,5], [2,3,4,5,5]]
  • 4
    Эта сюжетная линия - скороговорка
  • 1
    listOfLists содержит много ссылок на один и тот же список (т.е. noChange ). Вы должны создать новые экземпляры списка, если хотите, чтобы они были другими.
Теги:
list

3 ответа

0
Лучший ответ

Доступ к спискам осуществляется по ссылке, поэтому вам нужна .copy() чтобы создать новую.

noChange = [1,2,3,4,5]
lotsOfLists = []

lotsOfLists += [noChange.copy()]

for i in range(4):
    noChange[i] += 1
lotsOfLists += [noChange]

print(lotsOfLists) # output: [[1,2,3,4,5], [2,3,4,5,5]]

Как утверждают другие, вы также можете использовать оператор slicing [:] для достижения того же результата. ИМХО, семантика отличается. С оператором резки вы говорите читателю, что хотите что-то нарезать. С помощью операции copy() вы скажите читателю, что вы хотите что-то скопировать.

0

Списки являются изменяемыми, что вызывает проблемы. Используйте фрагменты для копий.

noChange = [1,2,3,4,5]
lotsOfLists = []

lotsOfLists += [noChange[:]]

for i in range(4):
    noChange[i] += 1
lotsOfLists += [noChange[:]] 

print(lotsOfLists) #output [[1, 2, 3, 4, 5], [2, 3, 4, 5, 5]]
0

Всякий раз, когда вы используете линию

lotsOfLists += [noChange] 

измените его на

lotsOfLists += [noChange[:]] 

Добавление [:] сделает копию списка и не изменит его позже

Ещё вопросы

Сообщество Overcoder
Наверх
Меню