给出一个列表
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的默认拷贝方式是浅拷贝。
时间角度:浅拷贝花费时间更少;
空间角度:浅拷贝花费内存更少;
效率角度:浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高。