位置: IT常识 - 正文
推荐整理分享Python深浅拷贝是什么(python深拷贝与浅拷贝区别),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:python深拷贝和浅拷贝详解,python深拷贝和浅拷贝应用场景,python中深浅拷贝,python深拷贝和浅拷贝应用场景,python深拷贝浅拷贝和赋值,python深拷贝浅拷贝和赋值,python深拷贝浅拷贝,python中深浅拷贝,内容如对您有帮助,希望把文章链接给更多的朋友!
一、浅拷贝
浅拷贝是对一个对象的顶层拷贝,通俗地讲就是:拷贝了引用,并没有拷贝内容。
a=[1,2,3]print(id(a))b=aprint(b)print(id(b))a.append(4)print(a)print(b)运行结果为:
1965053928072[1,2,3]1965053928072[1,2,3,4][1,2,3,4]二、深拷贝
深拷贝是对于一个对象所有层次的拷贝,重新开辟内存地址。
importcopya=[1,2,3]print(id(a))#使用copy模块b=copy.deepcopy(a)#打印b的内存地址print(id(b))a.append(4)print(a)print(b)运行结果为:
20351579696722035158105992[1,2,3,4][1,2,3]相关推荐:《Python视频教程》
三、深浅拷贝对比
importcopya=[1,2,3]b=[4,5,6]c=[a,b]d=c#直接赋值,浅拷贝print("c的内存地址为:%s"%id(c))print("d的内存地址为:%s"%id(d))#使用copy模块#深拷贝,重新开辟内存,并内容独立e=copy.deepcopy(c)#深拷贝,重新开辟内存,但是新内容里面仍保存原来的引用f=copy.copy(c)#打印e,f的地址print("e的内存地址为:%s"%id(e))print("f的内存地址为:%s"%id(f))#改变a的值a.append(44)#打印a,b,c,d,e,fprint("a=%s"%a)print("b=%s"%b)print("c=%s"%c)print("d=%s"%d)print("e=%s"%e)print("f=%s"%f)运行结果为:
c的内存地址为:2514746494856d的内存地址为:2514746494856e的内存地址为:2514746494920f的内存地址为:2514746494664a=[1,2,3,44]b=[4,5,6]c=[[1,2,3,44],[4,5,6]]d=[[1,2,3,44],[4,5,6]]e=[[1,2,3],[4,5,6]]f=[[1,2,3,44],[4,5,6]]说明:
1.c和d的内存地址一样,说明是浅拷贝,两个引用指向的是同一块内存。
2.c,e,f内存地址不一样,说明e和f都是深拷贝,都重新开辟的内存地址。
3.在a追加了元素44之后,打印的e中并有追加44,说明深拷贝,内容独立。
4.在a追加了元素44之后,打印的f中也追加44,说明f也重新开辟了内存,但是新内容里面保存的是原来的引用。
四、copy对可变和不可变对象的不同
1、可变类型使用copy
importcopya=[1,2,3]b=copy.copy(a)print(id(a))print(id(b))a.append(4)print(a)print(b)运行结果为:
16266777178321626677715784[1,2,3,4][1,2,3]2、不可变类型使用copy
importcopya=(1,2,3)b=copy.copy(a)print(id(a))print(id(b))运行结果为:
20434442807042043444280704总结:
简单的赋值是浅拷贝。
copy模块里面的copy()函数可以做一层深拷贝,虽然重新开辟了新的内存,但新内存里面仍然存放得是原来的引用。
上一篇:dedecms织梦的性能选项与其它选项的设置方法(织梦是什么框架开发的)
下一篇:python logging日志的禁用(python中的logging记录日志)
友情链接: 武汉网站建设