当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《复制列表的最佳方法是什么?》经验,为你挑选了4个好方法。



1> Mark Roddy..:

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

lst2=lst1[:]

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

import copy
lst2=copy.deepcopy(lst1)


如果元素是可变对象,则它们通过引用传递,您必须使用deepcopy来真正复制它们.
更明确的方法是:`lst2 = list(lst1)`
它只会复制列表中包含的引用.如果列表中的元素包含对另一个对象的引用,则不会复制该对象.十分之九,你只需要浅拷贝.

2> Andrea Ambu..:

我经常使用:

lst2 = lst1 * 1

如果lst1包含其他容器(如其他列表),则应使用复制库中的deepcopy,如Mark所示.


更新:解释深度复制

>>> 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]]


`copy()`在最后一种情况下不起作用,只要你在对象里面有一个引用,你就需要`deepcopy()`.

3> Martin Cote..:

你也可以这样做:

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


不,使用list()绝对是一个浅层副本.试试看.
结果是浅的还是深的副本?
有速度差吗?可以说,当你执行`[:]`时,库足够聪明,知道正在创建一个副本,因此它可能会调用一些本机C代码来执行此操作.使用`list(iterable)`它是否知道/关心iterable已经实现,因此可以有效地复制?

4> John Fouhy..:

我喜欢做:

lst2 = list(lst1)

优于lst1 [:]的优点是相同的成语适用于dicts:

dct2 = dict(dct1)

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有