什么是复制列表的最佳方式?
什么是复制列表的最佳方式? 我知道以下哪个方法,哪个更好? 还是有另一种方式?
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()
可读性可能超过了这个值,但是在紧密的循环中,这可能是一个有价值的优化。