我正在使用Python 2.7
我有一个列表lst = ['a','b','c']
如果我需要这份清单的副本,我曾经lst_cpy = lst[:]
。
我在包deepcopy
中遇到了一个函数copy
,这使我能够实现同样的目标。
import copy
lst_cpy_2 = copy.deepcopy(lst)
我可以互换使用这两种方法,还是两者之间有什么区别?
感谢。
答案 0 :(得分:5)
在简单列表的情况下,它们是相同的。如果您的列表中包含其他结构,例如列表或词典的元素,则它们会有所不同。
L[:]
创建一个新列表,新列表中的每个元素都是对旧列表中值的新引用。如果其中一个值是可变的,则可以在新列表中看到对它的更改。 copy.deepcopy()
创建一个新列表,每个元素本身都是旧列表中值的深层副本。因此,嵌套数据结构将在每个级别进行复制。
答案 1 :(得分:1)
由于无法深度复制字符串,因此切片此特定列表具有相同的效果。但通常[:]
执行序列的浅层复制。
答案 2 :(得分:1)
我认为不同之处在于列表中的某个项目是列表,字典或其他可变对象。使用普通副本,副本之间共享对象:
>>> 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']]