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

16 浏览
0 Comments

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

这个问题已经有答案了

如何复制一个列表以防止赋值后出现意外更改?

复制一个列表的最佳方式是什么?我知道以下几种方式,哪个更好?或者还有其他的方式吗?

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

admin 更改状态以发布 2023年5月22日
0
0 Comments

我经常使用:

lst2 = lst1 * 1

如果lst1 包含其他容器(如其他列表),则应使用来自“复制”库的深层复制,如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]是完全相同的对象。
现在尝试使用深度复制

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

0
0 Comments

如果你想要执行浅拷贝(元素不会被复制),可以使用以下方法:\n

lst2=lst1[:]

\n如果你想要进行深层拷贝,则可以使用copy模块:\n

import copy
lst2=copy.deepcopy(lst1)

0