python-复制列表的最佳方法是什么?

这个问题在这里已有答案:

  • 如何克隆或复制列表?                                     15个答案

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

lst = ['one', 2, 3]

lst1 = list(lst)

lst2 = lst[:]

import copy
lst3 = copy.copy(lst)
sheats asked 2019-11-15T17:40:40Z
7个解决方案
91 votes

如果要浅拷贝(不复制元素),请使用:

lst2=lst1[:]

如果要进行深复制,请使用复制模块:

import copy
lst2=copy.deepcopy(lst1)
Mark Roddy answered 2019-11-15T17:41:13Z
19 votes

我经常使用:

lst2 = lst1 * 1

如果lst1包含其他容器(如其他列表),则应使用Mark所示的副本库中的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]是同一对象。现在尝试使用Deepcopy

>>> 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]]
Andrea Ambu answered 2019-11-15T17:42:10Z
12 votes

你也可以这样做:

a = [1, 2, 3]
b = list(a)
Martin Cote answered 2019-11-15T17:42:29Z
6 votes

我喜欢做:

lst2 = list(lst1)

与lst1 [:]相比,优点是相同的用法适用于字典:

dct2 = dict(dct1)
John Fouhy answered 2019-11-15T17:43:00Z
3 votes

简短列表,[:]最好:

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),它们仍然大致相同。

shakefu answered 2019-11-15T17:43:40Z
2 votes

您也可以这样做:

import copy
list2 = copy.copy(list1)

这应该与马克·罗迪的浅抄本做同样的事情。

Jason Baker answered 2019-11-15T17:44:06Z
1 votes

在性能方面,与切片相比,调用list()有一些开销。 因此,对于短名单,list()大约是lst2 = list(lst1)的两倍。

在大多数情况下,list()更具可读性这一事实可能会抵消这一点,但是在紧密的循环中,这可能是有价值的优化。

DNS answered 2019-11-15T17:44:37Z
translate from https://stackoverflow.com:/questions/184643/what-is-the-best-way-to-copy-a-list