Если нарезка не создает копию списка или список(), как я могу получить реальную копию моего списка?

Я пытаюсь изменить список, и поскольку мои модификации были немного сложными, а мой список был большим, я взял фрагмент своего списка, используя следующий код

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 [:] используется чаще, чем альтернатива.