深复制与浅复制的区别

首先说一下python的内存管理

变量在第一次赋值时自动声明,在创建也就是赋值的时候,解释器会根据语法和右侧的操作数来决定对象的类型。

引用计数器:一个内部跟踪变量
引用计数:每一个变量各有多少个引用
当对象被创建并(将其引用)赋值给变量时,该对象的引用计数就被设置为1
x=3.14
这个语句创建了浮点型对象并将引用赋值给了x,x是第一个引用,该对象的引用计数为1
当一个对象(的引用)又被赋值到其他变量,或做参数传递等,该对象的一个新的引用(或叫别名)被创建,该对象的引用计数自动+1.
以下都会增加引用计数:
y=x
foo(x)
mylist=[1,2,x,'a']

比如:
a=[1,2,3,4,5] b=a b[0]=9
输出a,b都变成了[9,2,3,4,5]


python的复制

从上面可见,对象的赋值实际上是对象的引用,当创建一个对象,然后把它赋值给另一个变量的时候,pyhton并没有拷贝这个对象,而只是拷贝了这个对象的引用

如果你想改变一个对象,而且想让原始的对象不受影响,那就需要对象复制

1、使用切片操作[:]进行拷贝
2、使用工厂函数(如list/dir/set)等进行拷贝
3、copy.copy()
比如:
a=[1,2,3,4,5] b=a[:] b[1]=9
输出a[1,2,3,4,5]
输出b[1,9,3,4,5]