十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章主要讲解了“python浅拷贝和深拷贝的区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python浅拷贝和深拷贝的区别”吧!
创新互联专注于中大型企业的成都网站建设、网站设计和网站改版、网站营销服务,追求商业策划与数据分析、创意艺术与技术开发的融合,累计客户1000+,服务满意度达97%。帮助广大客户顺利对接上互联网浪潮,准确优选出符合自己需要的互联网运用,我们将一直专注成都品牌网站建设和互联网程序开发,在前进的路上,与客户一起成长!
我们平常使用的变量赋值就是浅拷贝,即两个变量共享同一个内存块,相同的内存地址,一旦值发生改变,另外一个变量的值也会跟随着一起变化,演示代码如下:
1 2 3 4 5 6 7 8 9 10 | list1=[1,2,3,4,5] # 普遍的变量赋值 list2=list1 print(id(list1)) print(id(list2))
# 修改列表list2的数据 list2.append(123) print(list1) print(list2) |
输出结果:
1 2 3 4 | 2251297055368 2251297055368 [1,2,3,4,5,123] [1,2,3,4,5,123] |
注意:常规的变量赋值共享一个内存块,内存地址相同,一旦值发生改变,共享同一个内存地址的所有变量值都会发生改变,可以直接通过内置函数id()对比下内存地址即可!
在python开发过程中,有些时候对于上面的情况并不是我们想要的,我们更加希望对赋值后的变量做修改并不影响原始变量的值,如何实现呢?这里就需要介绍一下copy模块:
copy.copy() – 浅拷贝,重新分配内存,只拷贝父对象,不会拷贝对象的内部的子对象;
copy.deepcopy() – 深拷贝,重新分配内存,拷贝对象及其所有子对象;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解忧 @Blog(个人博客地址): shuopython.com @WeChat Official Account(微信公众号):猿说python @Github:www.github.com
@File:python_copy.py @Time:2019/10/27:25
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! """
importcopy spam=['A','B','C','D'] # 使用浅拷贝 cheese=copy.copy(spam) cheese[1]=42 print(id(spam),spam) print(id(cheese),cheese) |
输出结果:
1 2 | 57205555['A','B','C','D'] 57208888['A',42,'C','D'] |
1 2 3 4 5 6 7 | importcopy spam=['A','B','C','D'] # 使用深拷贝 cheese=copy.deepcopy(spam) cheese[1]=42 print(id(spam),spam) print(id(cheese),cheese) |
输出结果:
1 2 | 57205555['A','B','C','D'] 57208888['A',42,'C','D'] |
对于常规的字典或者列表使用copy模块的深拷贝或者浅拷贝,两者并没有区别!如果字典或者列表中还有包含有子类的话,使用copy模块的深拷贝和浅拷贝的话,结果就大不相同了:
copy.copy() — 重新分配内存,只拷贝父对象,不会拷贝对象内部的子对象;
copy.deepcopy() — 重新分配内存,拷贝对象及其所有子对象;
示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | importcopy
print("使用浅拷贝:") spam=[['A','E'],'B','C','D'] # 使用浅拷贝 cheese=copy.copy(spam) cheese[0][0]=42 print(id(spam),spam) print(id(cheese),cheese) print("***"*20)
print("使用深拷贝:") spam=[['A','E'],'B','C','D'] # 使用深拷贝 cheese=copy.deepcopy(spam) cheese[0][0]=42 print(id(spam),spam) print(id(cheese),cheese) |
输出结果:
1 2 3 4 5 6 7 | 使用浅拷贝: 2179653046408[[42,'E'],'B','C','D'] 2179653046920[[42,'E'],'B','C','D'] ************************************************************ 使用深拷贝: 2179653086728[['A','E'],'B','C','D'] 2179653046408[[42,'E'],'B','C','D'] |
http://shouzuofang.com/article/jihisj.html