python中浅拷贝与深拷贝
1,浅拷贝(copy)
浅拷贝,拷贝的是父对象,不会拷贝到内部的子对象。(单从一个浅字就可以看出他拷贝的东西不深,可以理解为只拷贝一层)
import copy a = [1,"ss",[2,3],{"xi":18}] b = copy.copy(a) print(b) print(id(a)) print(id(b))
现在有一个列表a里面有数字,字符串,列表和字典 用浅拷贝的方法给到b 现在打印下b的内容 和a,b的内存地址
可以看到 内容一样但是内存地址不一样 换另外一种比较方式看看
import copy a = [1,"ss",[2,3],{"xi":18},(2,3)] b = copy.copy(a) print(id(a[1])) print(id(b[1])) print(id(a[2])) print(id(b[2]))
比较列表下任何一个子元素 他们的内存地址都是一样的
可以看到内存地址都是一样的
import copy a = [1,"ss",[2,3],{"xi":18},(2,3)] b = copy.copy(a) a.append(50) print(a) print(b)
现在向列表中添加一个数据看看b发生改变没
可以看到b没有发生改变
import copy a = [1,"ss",[2,3],{"xi":18},(2,3)] b = copy.copy(a) a[1]="haha" a[2].append(80) print(a) print(b)
现在改变不可变类型字符串的值,在向可变数据类型列表加入一个新值 打印一哈
可以看到可变数据类型更改了之后 b随着a 的改变而改变了 给不可变数据类型赋值后 b 还是指向了ss这个值
示意图:
唯一要注意的是如果是元组的拷贝的话 内存地址是一样的
a = (1, "ss", [2, 3], {"xi": 18}, (2, 3)) b = copy.copy(a) print(id(a)) print(id(b))
2.深拷贝(deepcopy)
深拷贝,包含对象里面的自对象的拷贝(可以理解为克隆,全拷贝过去但是两者没有任何关系了,各玩各的),所以原始对象的改变不会造成深拷贝里任何子元素的改变
import copy a=[1,2,[3,4],5] b=copy.deepcopy(a) print(b) # 结果为 [1,2,[3,4],5] # 接下来我们更改a的数据 a.append(6) print(a) print(b) # 结果为 [1,2,[3,4],5,6]和[1,2,[3,4],5] # 可以发现浅层的数据更改(第一层)并没有让b发生变化 # 接下来进行子对象数据(深层数据)的更改 a[2].append(7) print(a) print(b) # 结果为 [1,2,[3,4,7],5,6]和[1,2,[3,4],5]
示意图: