Если нарезка не создает копию списка или список(), как я могу получить реальную копию моего списка?
Я пытаюсь изменить список, и поскольку мои модификации были немного сложными, а мой список был большим, я взял фрагмент своего списка, используя следующий код
tempList=origList[0:10]
for item in tempList:
item[-1].insert(0 , item[1])
del item[1]
Я подумал, что все изменения в списке повлияют на объекты tempList, а не на исходные объекты.
Хорошо, как только я получил свой код правильно и запустил его в своем первоначальном списке, первые десять элементов (с индексом 0-9) повлияли на мою манипуляцию при тестировании вышеприведенного кода.
Итак, я искал его, и я нахожу ссылки, в которых говорится, что кусочек копирует список и создает новый. Я также нашел код, который помог мне найти идентификатор элементов, поэтому я создал свой исходный код с нуля, получил идентификаторы первых десяти элементов. Я снова нарезал список и обнаружил, что идентификаторы из срезов соответствуют идентификаторам из первых десяти элементов origList.
Я нашел больше заметок, которые предполагали, что более питонический способ скопировать список будет заключаться в использовании
tempList=list(origList([0:10])
Я пробовал это, и я до сих пор считаю, что идентификаторы из tempList соответствуют идентификаторам из origList.
Пожалуйста, не предлагайте лучшие способы сделать кодирование - я собираюсь выяснить, как это сделать в списке Понимание самостоятельно, после того как я понял, как работает копирование
На основе ответа Кая правильный метод:
import copy
tempList=copy.deepcopy(origList[0:10])
id(origList[0])
>>>>42980096
id(tempList[0])
>>>>42714136
Работает как шарм
Ответы
Ответ 1
Нарезка создает неглубокую копию. В вашем примере я вижу, что вы вызываете insert()
для item[-1]
, что означает, что элемент является списком списков. Это означает, что ваши мелкие копии все еще ссылаются на оригинальные объекты. Вы можете думать об этом как о создании копий указателей, а не реальных объектов.
Ваше решение заключается в использовании глубоких копий. Python предоставляет модуль копирования только для такого рода вещей. Вы найдете гораздо больше информации о мелком или глубоком копировании при поиске.
Ответ 2
Если вы копируете объект, его содержимое не копируется. Вероятно, в большинстве случаев это то, что вы хотите. В вашем случае вы должны убедиться, что содержимое копируется самостоятельно. Вы можете использовать copy.deepcopy, но если у вас есть список списков или что-то подобное, я бы рекомендовал использовать copy = [l[:] for l in list_of_lists]
, это должно быть намного быстрее.
Небольшое примечание к вашему codestyle:
- del - это инструкция, а не функция, поэтому лучше не использовать здесь parens, они просто запутываются.
- Пробелы вокруг операторов и после запятых сделают ваш код более удобным для чтения.
- list (alist) копирует список, но не более pythonic, чем alist [:], я думаю, что alist [:] используется чаще, чем альтернатива.