什么是复制列表的最佳方式?

什么是复制列表的最佳方式? 我知道以下哪个方法,哪个更好? 还是有另一种方式?

lst = ['one', 2, 3] lst1 = list(lst) lst2 = lst[:] import copy lst3 = copy.copy(lst) 

如果你想要一个浅拷贝(元素不被复制),使用:

 lst2=lst1[:] 

如果您想制作深层复制,请使用复制模块:

 import copy lst2=copy.deepcopy(lst1) 

我经常使用:

 lst2 = lst1 * 1 

如果lst1包含其他容器(如其他列表),则应使用Mark所示的copy lib中的deepcopy。


更新:解释deepcopy

 >>> a = range(5) >>> b = a*1 >>> a,b ([0, 1, 2, 3, 4], [0, 1, 2, 3, 4]) >>> a[2] = 55 >>> a,b ([0, 1, 55, 3, 4], [0, 1, 2, 3, 4]) 

正如你可能会看到只有一个改变…我现在尝试列表的列表

 >>> >>> a = [range(i,i+3) for i in range(3)] >>> a [[0, 1, 2], [1, 2, 3], [2, 3, 4]] >>> b = a*1 >>> a,b ([[0, 1, 2], [1, 2, 3], [2, 3, 4]], [[0, 1, 2], [1, 2, 3], [2, 3, 4]]) 

不太可读,让我打印一个for:

 >>> for i in (a,b): print i [[0, 1, 2], [1, 2, 3], [2, 3, 4]] [[0, 1, 2], [1, 2, 3], [2, 3, 4]] >>> a[1].append('appended') >>> for i in (a,b): print i [[0, 1, 2], [1, 2, 3, 'appended'], [2, 3, 4]] [[0, 1, 2], [1, 2, 3, 'appended'], [2, 3, 4]] 

你看到了吗? 它也附加到b [1],所以b [1]和a [1]是完全相同的对象。 现在用深度拷贝来试试

 >>> from copy import deepcopy >>> b = deepcopy(a) >>> a[0].append('again...') >>> for i in (a,b): print i [[0, 1, 2, 'again...'], [1, 2, 3, 'appended'], [2, 3, 4]] [[0, 1, 2], [1, 2, 3, 'appended'], [2, 3, 4]] 

你也可以这样做:

 a = [1, 2, 3] b = list(a) 

我喜欢做:

 lst2 = list(lst1) 

与lst1 [:]相比,它的优点是相同的成语对于dicts是有效的:

 dct2 = dict(dct1) 

短名单,[:]是最好的:

 In [1]: l = range(10) In [2]: %timeit list(l) 1000000 loops, best of 3: 477 ns per loop In [3]: %timeit l[:] 1000000 loops, best of 3: 236 ns per loop In [6]: %timeit copy(l) 1000000 loops, best of 3: 1.43 us per loop 

对于更大的列表,它们大致相同:

 In [7]: l = range(50000) In [8]: %timeit list(l) 1000 loops, best of 3: 261 us per loop In [9]: %timeit l[:] 1000 loops, best of 3: 261 us per loop In [10]: %timeit copy(l) 1000 loops, best of 3: 248 us per loop 

对于非常大的列表(我试过50MM),他们仍然是大致相同的。

你也可以这样做:

 import copy list2 = copy.copy(list1) 

这应该和Mark Roddy的浅拷贝一样。

在性能方面,调用list()和slicing会有一些开销。 所以对于简短列表, lst2 = lst1[:]大约是lst2 = list(lst1)两倍。

在大多数情况下, list()可读性可能超过了这个值,但是在紧密的循环中,这可能是一个有价值的优化。