#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']]