点击上方蓝字关注我哦
首先要了解什么是拷贝、浅拷贝、深拷贝?
拷 贝:
从原始数据复制一份出来,当复制成功后,这两份数据都是相互独立的,即修改任意一份数据都不会影响另一份数据。
浅拷贝:
python中,浅拷贝就是只是拷贝最外层的类型,简单来讲就是拷贝了引用,并没有拷贝内容. copy.copy()
深拷贝:
对于一个对象所有层次的拷贝(递归拷贝)copy.deepcopy()
要知道深浅拷贝的区别,首先要知道python中什么是 可变数据类型 和 不可变数据类型
01
不可变数据类型的定义:
python中的不可变数据类型,值发生改变,id也改变
python中 不可变数据类型:
整型
浮点数
布尔值
字符串
元组
可变数据类型的定义:
可变数据类型,值改变,但是id可以不变
python中 可变数据类型:
列表
字典
集合
通过python中数据类型的分类,我们谈论以下几种的拷贝:
02
不可变数据类型:
赋值
浅拷贝
深拷贝
可变数据类型:
赋值
浅拷贝
深拷贝
不可变数据类型
不可变数据类型赋值:不改变值
只是进行了值的传递给不同的变量名,还在同一个空间
a1 = 1
print(id(a1))
a2 = a1
print(id(a2))
结果:
1867822144
1867822144
改变值
只能进行赋值操作才能改变改值,以整型举例
a1 = 1
print(id(a))
# 要想改变a的值,那就只能赋值,而进行赋值操作就已经改变了id
a1 = 2
print(id(a))
结果:
1867822144
1867822176
不可变数据类型浅拷贝
使用copy模块的copy()方法
import copy
a1 = 3.14
a2 = copy.copy(a1)
print(id(a1), id(a2))
# 输出结果
1698640564680 1698640564680
结论
通过使用copy模块里的copy()函数来进行浅拷贝,把a1拷贝一份赋值给a2,查看输出结果发现,a1和a2的内存地址还是一样。
可变数据类型
可变数据类型赋值:
a1 = [1,2,3,4]
a2 = a1
print(id(a1),id(a2))
# 输出结果 不改变id
2805765390984 2805765390984
可变数据类型浅拷贝:
调用列表的方法copy()
a = [1,2,3,4]
a1 = [1,2,3,4,a]
a2 = a1.copy()
print(id(a1),id(a2))
# 输出的外层id发生了改变
2943074293576 2943074291912
print(id(a1[4]),id(a2[4]))
# 输出的内层id没有发生了改变
2943073469064 2943073469064
没有实现真正的拷贝,内层的元素会让拷贝后的列表受到影响
可变数据类型深拷贝:
导入模块copy,使用方法deepcopy()
import copy
a = [1,2,3,4]
a1 = [1,2,3,4,a]
a2=copy.deepcopy(a1)
print(id(a1),id(a2))
# 输出结果 外层id改变
1929499550024 1929499551304
print(id(a1[4]),id(a2[4]))
# 输出结果 内层也id改变
1929499549832 1929499551240
实现真正的拷贝,内层的元素不会让拷贝后的列表受到影响
END
扫码关注我们呗
我就知道你“在看”