最佳的列表复制方法是什么?我知道以下几种方法,哪一种更好?或者还有其他方式吗?
lst = ['one', 2, 3]
lst1 = list(lst)
lst2 = lst[:]
import copy
lst3 = copy.copy(lst)
最佳的列表复制方法是什么?我知道以下几种方法,哪一种更好?或者还有其他方式吗?
lst = ['one', 2, 3]
lst1 = list(lst)
lst2 = lst[:]
import copy
lst3 = copy.copy(lst)
lst2=lst1[:]
如果想要进行深拷贝,请使用 copy 模块:
import copy
lst2=copy.deepcopy(lst1)
我经常使用:
lst2 = lst1 * 1
>>> 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]]
copy()
无法工作,当对象内部有引用时,您需要使用 deepcopy()
。 - Aram Kocharyanlst1*1
的技巧非常棒...但是,遗憾的是,粗略的分析表明它至少比 lst1[:]
慢两倍,而 copy(last1)
稍微快一点。 - Andrew你还可以这样做:
a = [1, 2, 3]
b = list(a)
[:]
时,库会聪明地知道正在进行复制操作,因此可能会调用一些本地的C代码来完成。而对于list(iterable)
,它是否知道或关心可迭代对象已经被实例化,因此可以高效地进行复制? - Hamish Grubijan我喜欢做的事情:
lst2 = list(lst1)
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
import copy
list2 = copy.copy(list1)
就性能而言,与切片相比,调用list()
会有一些额外开销。因此对于短列表,lst2 = lst1[:]
比lst2 = list(lst1)
快约两倍。
在大多数情况下,list()
更易读,这可能超过了性能优化的价值,但在紧密循环中,这可能是一个有价值的优化。
lst2 = list(lst1)
。 - CᴴᴀZ