Разница между использованием deepcopy и операцией с подстрокой

#python #list

#python #Список

Вопрос:

Я использую Python 2.7

У меня есть список lst = ['a','b','c']

Если мне нужна копия, если этот список, я привык делать lst_cpy = lst[:] .

Я наткнулся на функцию deepcopy в пакете copy , которая позволяет мне достичь того же.

 import copy
lst_cpy_2 = copy.deepcopy(lst)
  

Могу ли я использовать эти два метода взаимозаменяемо или есть какая-то разница между ними?

Спасибо.

Комментарии:

1. Документы — ваш друг.

Ответ №1:

В случае простого списка они одинаковы. Если бы в вашем списке были другие структуры, например, элементы, которые были списками или словарями, они были бы другими.

L[:] создает новый список, и каждый элемент в новом списке является новой ссылкой на значения в старом списке. Если одно из этих значений является изменяемым, его изменения будут видны в новом списке. copy.deepcopy() создает новый список, и каждый элемент сам по себе является глубокой копией значений в старом списке. Таким образом, вложенные структуры данных копируются на каждом уровне.

Ответ №2:

Поскольку нет способа / необходимости глубокого копирования строки, нарезка этого конкретного списка имеет тот же эффект. Но обычно [:] выполняет мелкую копию последовательности.

Ответ №3:

Я считаю, что разница заключается в том, что один из элементов в вашем списке является list , dict или другим изменяемым объектом. При обычной копии объект разделяется между копиями:

 >>> l = ['a','b',[1,2]]
>>> l2 = l[:]
>>> l2[2].append('c')
>>> l
['a', 'b', [1, 2, 'c']]
  

но при deepcopy() этом объект также копируется:

 >>> l2 = copy.deepcopy(l)
>>> l2[2].append('d')
>>> l
['a', 'b', [1, 2, 'c']]
>>> l2
['a', 'b', [1, 2, 'c', 'd']]