给出一个列表
x=[1,2,3,4]进行如下操作
y=x y[0]=10 print(x) [10,2,3,4]用这种方式将x的值赋给y之后,修改y中的元素也会改变x中的元素。 因为y和x都是对同一块内存空间的引用。
我们可以创造x的一个浅拷贝
y=x[:] #或者 y=x.copy() y[0]=10 print(x) [1,2,3,4] #此时修改y的值,x不发生改变重新定义一个新的列表x
x=[1,2,[3,4]] y=x.copy() y[0],y[2][0]=10,10 print(y) print(x) [10, 2, [10, 4]] [1, 2, [10, 4]]y的元素自然改变了,但是x中的一级元素发生改变,二级元素并没有发生改变。
浅拷贝,让一级元素有了独立的内存空间,二级元素仍然指向了被拷贝对象的二级元素的内存区域。即浅拷贝只复制了父对象,而不复制内部子对象。
我们这次导入copy模块
import copy x=[1,2,[3,4]] y=copy.deepcopy(x) y[0],y[2][0]=10,10 print(y) print(x) [10, 2, [10, 4]] [1, 2, [3, 4]]此时一级元素和二级元素都没有发生改变。
python的默认拷贝方式是浅拷贝。 时间角度:浅拷贝花费时间更少; 空间角度:浅拷贝花费内存更少; 效率角度:浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高。