Python深浅拷贝!
今天博主跟大家聊一聊如何使用Python深浅拷贝!不喜勿喷,如有建议欢迎补充、讨论!
关于安装和汉化可以观看博主的这篇文章《下载安装及汉化 》以及Python系列:windows10配置Python3.0开发环境!,安装完毕重启VsCode!以及VSCode配置Python开发环境!
Come on!深浅拷贝
1. 浅拷贝:
在了解深浅拷贝时,我们先看一个拷贝列表的例子:
'''
@name: Sunny Chen
@test: test font
@msg: 这是由Sunny Chen创建.
@param:
@return:
'''
ls1=["Mr_Chen","Sunny",[1,2,3]]
ls2=ls1.copy() #浅拷贝
# print(ls2)
#修改列表中的不可变数据类型,ls2变,ls1不变
ls2[0]="xiaojia"
print(ls1,ls2)
#输出为:['Mr_Chen', 'Sunny', [1, 2, 3]] ['xiaojia', 'Sunny', [1, 2, 3]]
#修改列表中的可变数据类型,ls2变,ls1也变
ls2[2][0]=6666
print(ls1,ls2)
#输出为:['Mr_Chen', 'Sunny', [6666, 2, 3]] ['xiaojia', 'Sunny', [6666, 2, 3]]
从上述例子中我们可以知道,对于浅拷贝,由ls1拷贝成ls2,当修改ls2中的不可变数据类型时,s1不发生变化;而当修改ls2中的可变数据类型是,s2则发生改变。
这是由于:浅拷贝–>拷贝的仅仅是原列表以及原列表元素中内存指针,故ls2中的不可变数据类型发生改变时,其内存指针也发生了改变,则当ls2[0]发生改变时,其内存指针发生改变,指向的不再存储"little-five"的内存空间,而是存放"xiaowu"的内存空间。故ls1不受影响。而当修改ls2中可变数据类型时,修改列表[1,2,3]中的元素时,该列表[1,2,3]的内存地址并不发生改变,故ls1和ls2的内存指针均指向该列表[1,2,3],故ls2发生该表,ls1也跟着改变。从下面例子可以看出可变数据类型和不可变数据类型的区别:
'''
@name: Sunny Chen
@test: test font
@msg: 这是由Sunny Chen创建.
@param:
@return:
'''
#当修改不可变数据类型时,其内存指针发生改变
name="Sunny"
print(id(name)) #2351401446384
name="Mr_Chen"
print(id(name)) #2351401447024
#当修改可变数据类型,其内存指针不发生改变
lis=["zhangsan","lisi","wangwu"]
print(id(lis)) #2351401111048
lis[2]="wangmazi"
print(id(lis)) #2351401111048
我们也可以从下图更好的理解浅拷贝:
-
修改数据前:
-
修改数据后:
2. 深拷贝
'''
@name: Sunny Chen
@test: test font
@msg: 这是由Sunny Chen创建.
@param:
@return:
'''
import copy #导入拷贝模块
ls3=["zhangsan","lis","wnagwu",[1,2,3]]
#ls5=copy.copy(li3) #浅拷贝
ls4=copy.deepcopy(ls3) #深拷贝
print(ls4)
ls4[0]="Mr_ChenYongJia"
print(ls3,ls4) #输出为:['zhangsan', 'lis', 'wnagwu', [1, 2, 3]] ['Mr_ChenYongJia', 'lis', 'wnagwu', [1, 2, 3]]
ls4[3][0]=666
print(ls3,ls4) #输出为:['zhangsan', 'lis', 'wnagwu', [1, 2, 3]] ['Mr_ChenYongJia', 'lis', 'wnagwu', [666, 2, 3]]
从上述例子可以看出,ls3与ls4再无任何关联,这是由于ls4拷贝过来时,其拷贝的不止内存指针,同时还创建新的内存空间,并将数据拷贝至新的内存空间。故新的内存指针指向新的内存空间。
到这里:Python深浅拷贝!分享完毕了,快去试试吧!
最后
-
更多参考精彩博文请看这里:陈永佳的博客
-
喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!