python中了解深浅拷贝可以更好的帮助我们理解python,因为这里面涉及到了地址等底层知识
1.什么是地址
在python中任何变量或者数据的存储都是存储在物理内存中的,而每一个字节都是有编号的,也就是内存地址,类似我们的储物柜,每一个柜子都是有编号的
在python中查看一个变量的内存地址使用id()内置函数,如:
var = [1, 2, 3] print(id(var)) # 2334371164288
2.赋值
变量的赋值,也就是内存地址的赋值,两个或者多个变量指向同一个内存地址,一旦内存地址所在的值发生改变,则所有变量的值都会发生改变
var = 'hello world' var1 = var print(id(var1), id(var)) # 2492276210480 2492276210480 li = [1, 2, 3, 4] li2 = li print(id(li), id(li2)) # 2384305926208 2384305926208
3.浅拷贝
浅拷贝针对的都是可变的数据类型,如list,dict,set等,对于不可变的数据类型str,int,tuple谈不上拷贝,浅拷贝拷贝的只是第一层
import copy li = [[1, 2 ,3], (4, 5, 6),'hello'] li2 = copy.copy(li) print(id(li), id(li2)) # 2484118695104 2484121212032 print(id(li[0]), id(li2[0])) # 3019494775168 3019494775168 print(id(li[1]), id(li2[1])) # 3019494774400 3019494774400 print(id(li[2]), id(li2[2])) # 3019492190000 3019492190000
4.深拷贝
对于深拷贝而言,会将可变类型中所有层级中的可变类型拷贝一份,使得两个变量之间完全独立,当然对于不可变类型,python内部做了优化,不会拷贝,但是如果尝试修改不可变类型,则会创建一份新的对象
import copy li = [[1, 2 ,3], (4, 5, 6),'hello'] li2 = copy.deepcopy(li) print(id(li), id(li2)) # 1181821250944 1181823768000 print(id(li[0]), id(li2[0])) # 1181823785600 1181823745536 print(id(li[1]), id(li2[1])) # 1181823784832 1181823784832 print(id(li[2]), id(li2[2])) # 1181821200176 1181821200176
深浅拷贝在实际工作中构建数据类型会起到很大的作用,后续章节再做介绍