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

 

 

 

 

深浅拷贝在实际工作中构建数据类型会起到很大的作用,后续章节再做介绍

posted on 2022-11-08 10:37  阿明明  阅读(43)  评论(0编辑  收藏  举报