参考链接
前提
想要了解深浅拷贝之前必须要知道可变和不可变类型,和他们的特性
不可变类型
数字 字符串 元组 不可变集合
特性:改变值,会创建新的内存空间存储数据
可变类型
列表 字典 可变列表
特性:改变值,还是引用之前的内存空间
Python引用赋值
开篇
引用赋值其实就是=,多个变量指向同一个内存空间
不可变案例
#a指向1000的内存地址
a = 1000
#b也指向1000的内存地址
b = a
#a指向了2000的地址,b指向1000的内存地址
a = 2000
可变案例
L = [333,444,555]
L[1] = 4444
#L的地址是没有变化的,但是L[1]的地址发生的变化
列表的内存
列表的内存结构图,第一层的地址是不会随内容的改变而改变的
Python深浅拷贝
注意
深浅拷贝这个概念其实是针对可变数据类型的,不可变类型就没有这个概念
深浅拷贝概念
浅拷贝
shallow copy,只拷贝第一层的数据。copy模块的copy()就是浅拷贝
深拷贝
deep copy,递归拷贝所有层次的数据,python中copy模块的deepcopy()是深拷贝
浅拷贝
只拷贝了第一层的数据,存放在另一个空间
马老师亲手给我画的图
为下列代码的内存分布图
from copy import copy
a = [1,2,3]
b = [4,5,a]
c = copy(b)
#查看id
#id不同.第一层是完全独立的
print(id(b),id(c))
#第二层还是引用的同一个列表
b[2][0] = 200
print(id(b[2]),id(c[2]))
1800001515976 1799717541960
1800000907528 1800000907528
深拷贝
完全拷贝,两个空间是完全独立的,没有一点关系了
from copy import deepcopy
a = [1,2,3]
b = [4,5,a]
c = deepcopy(b)
#全部独立
print(id(b),id(c))
print(id(b[2]),id(c[2]))
2214201160136 2216093571144
2214200551688 2214201162312