先摆结论:普通copy的用法只能copy一维列表,如果要对多元列表进行copy只能使用深拷贝,即deepcopy!
探究过程:
先定义一个varlist列表,并对这个列表进行copy,并把copy的结果返回给newlist。
varlist=[1,2,3,4]
newlist=varlist.copy()
print(varlist)
print(newlist)
得到打印的结果为:
[1, 2, 3, 4]
[1, 2, 3, 4]
现在我们对这两个列表进行删除处理,删除任意一个元素,以删除2为例:
del newlist[1]
print(varlist,id(varlist))
print(newlist,id(newlist))
得到的打印结果为:
[1, 2, 3, 4] 2052082913800
[1, 3, 4] 2052082914312
可见对原列表进行删除操作并不会影响新列表,并且原列表和新列表的Id地址并不一样。然而当我们定义一个多元列表(以二元列表为例)结果却发生了变化:
varlist=[1,2,3,['a','b','c']]
newlist=varlist.copy()
del newlist[3][1]
print(varlist,id(varlist),id(varlist[3]))
print(newlist,id(newlist),id(newlist[3]))
打印结果:
[1, 2, 3, ['a', 'c']] 3110096622600 3110096622088
[1, 2, 3, ['a', 'c']] 3110097900872 3110096622088
发现对新列表中的二维数据进行操作对原列表也产生了同样的影响,当我们进行Id检测时,内侧列表的id值相同(3110096622088),因此copy用法对内侧的列表无法进行copy,因此称为浅拷贝。
如果我们想要对多维列表进行copy就要通过深拷贝的方法进行copy,即deepcopy,方法如下:
首先通过import导入一个copy然后使用deepcopy()函数进行深拷贝。
import copy
varlist=[1,2,3,['a','b','c']]
newlist=copy.deepcopy(varlist)
del newlist[3][1]
print(varlist,id(varlist),id(varlist[3][1]))
print(newlist,id(newlist),id(newlist[3][1]))
打印结果为:
[1, 2, 3, ['a', 'b', 'c']] 1587765855560 1587763339696
[1, 2, 3, ['a', 'c']] 1587765855880 1587762504688
这样我们就成功的对多维列表进行了拷贝。
希望这篇博客能对大家带来帮助。