У меня проблемы с получением результата, который я хочу. Я хочу создать список и иметь первый элемент нового списка в этом первоначальном списке. Затем я хочу изменить первый список, и новая измененная версия этого списка будет вторым элементом нового списка. Прямо сейчас это выдает [[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]]
Доступ к спискам осуществляется по ссылке, поэтому вам нужна .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() вы скажите читателю, что вы хотите что-то скопировать.
Списки являются изменяемыми, что вызывает проблемы. Используйте фрагменты для копий.
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]]
Всякий раз, когда вы используете линию
lotsOfLists += [noChange]
измените его на
lotsOfLists += [noChange[:]]
Добавление [:]
сделает копию списка и не изменит его позже
listOfLists
содержит много ссылок на один и тот же список (т.е.noChange
). Вы должны создать новые экземпляры списка, если хотите, чтобы они были другими.