python中浅拷贝与深拷贝

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]

示意图:

原文地址:https://www.cnblogs.com/love2000/p/14084237.html