copy.deepcopy()_python列表copy函数

copy.deepcopy()_python列表copy函数python中对于对象的拷贝分为浅拷贝(copy)和深拷贝(deepcopy)两种方式。其中浅拷贝由“=”完成。而深拷贝由copy模块中deepcopy()函数担任。浅拷贝和深拷贝的区别是:浅拷贝只是将原对象在内存中引用地址拷贝过来了。让新的对象指向这个地址。而深拷贝是将这个对象的所有内容遍历拷贝过来了,相当于跟原来没关系了,所以如果你这时候修改原来对象的值跟他没关系了,不会随…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

    python中对于对象的拷贝分为浅拷贝(copy)和深拷贝(deepcopy)两种方式。其中浅拷贝由“=”完成。而深拷贝由copy模块中deepcopy()函数担任。

    浅拷贝和深拷贝的区别是:浅拷贝只是将原对象在内存中引用地址拷贝过来了。让新的对象指向这个地址。而深拷贝是将这个对象的所有内容遍历拷贝过来了,相当于跟原来没关系了,所以如果你这时候修改原来对象的值跟他没关系了,不会随之更改。

1.浅拷贝”=”的使用

#1.使用=复制不可变对象的值,以及复制以后修改其值后的变化。
val1 = 1000
val2 = val1
print("val1 is :{0},val2 is :{1}".format(val1,val2))#val1 is :1000,val2 is :1000
print(id(val1),id(val2))  #34052192 34052192
#这时候修改val1的值,尽管val2指向val1.但因为val1是不可变类型,修改其值,会重新给新值分配内存,然后指向他。
val1 += 1
print(val1,id(val1),val2,id(val2)) #1001 10131616 1000 10131568  值不一样,内存地址也不一样了

#1.使用=复制可变对象的值,以及复制以后修改其值后的变化。
ls1 =[1,2,3,4]
ls2 = ls1
print(id(ls1),id(ls2)) #43702792 43702792 直接使用=复制变量,内存地址一样,值也一样。
print(ls1,ls2) #[1, 2, 3, 4] [1, 2, 3, 4]直接使用=复制变量,内存地址一样,值也一样。
#这时候修改可变对的值,因为其值可变,所以只需要在原内存地址上修改即可。
ls1.append(5)
print(id(ls1),id(ls2)) #可变对象修改其值,内存引用不变
print(ls1,ls2) #[1, 2, 3, 4, 5] [1, 2, 3, 4, 5] 因为两个变量的内存指向一样,所以值也一样。

2.深拷贝:copy.deepcopy()函数

#1.使用copy.deepcopy()拷贝不可变对象的值,以及复制以后修改其值后的变化。
val1 = 1000
val2 = copy.deepcopy(val1)
print("val1 is :{0},val2 is :{1}".format(val1,val2))#val1 is :1000,val2 is :1000
print(id(val1),id(val2))  #33717408 33717408 对于不可变对象,深度拷贝内存地址没有修改。

val1 += 1
print(val1,id(val1),val2,id(val2)) #1001 33717904 1000 33717408

#1.使用copy.deepcopy()复制可变对象的值,以及复制以后修改其值后的变化。
ls1 =[1,2,3,4]
ls2 = copy.deepcopy(ls1)
print(id(ls1),id(ls2)) #34628472 34628712 注意对于可变对象深度拷贝后内存地址都修改了。
print(ls1,ls2) #[1, 2, 3, 4] [1, 2, 3, 4]
ls1.append(5)
print(id(ls1),id(ls2)) #34628472 34628712
print(ls1,ls2) #[1, 2, 3, 4, 5] [1, 2, 3, 4] #注意这个时候ls2的值没有随着ls1修改。

总结:其实对于浅拷贝和深拷贝来说,如果拷贝对象都是不可变对象的话,那么两者效果是一样的。如果是可变对象的话,“=”拷贝的方式,只是拷贝了内存中的地址引用,两个对象的地址引用一样,所以两个对象的值会随着一方的修改而修改。而对于deepcopy()来说,如果是可变对象的话,那么拷贝内容后新对象的内存地址也会重新分配,跟原来的内存地址不一样了。所以两者任意修改变量的内容不会对另一方造成影响。

3.注意一个特殊的copy(),跟深浅拷贝都有区别,慎用。

  1. copy.copy对于可变类型,会进行浅拷贝
  2. copy.copy对于不可变类型,不会拷贝,仅仅是指向
1.使用copy()拷贝不可变对象
val1 = 1000
val2 = copy.copy(val1)
print(val1,val2)##1000 1000
print(id(val1),id(val2))#8551568 8551568
2.使用copy()拷贝可变对象
ls1 =[1,2,3,4]
ls2 = copy.copy(ls1)
ls1.append(5)
print(ls1,ls2)  #[1, 2, 3, 4, 5] [1, 2, 3, 4]

看上去copy()函数效果和deepcopy()效果一样,可变对象拷贝后值也没有随着一个对象的修改而修改。
然后真实情况真是这样嘛?请看下面的案例,同样是拷贝可变对象。

origin = [1, 2, [3, 4]]
cop1 = copy.copy(origin)
cop2 = copy.deepcopy(origin)
origin[2][0] = "hey!"  #修改数据源的值
print(cop1,cop2) #[1, 2, ['hey!', 4]] [1, 2, [3, 4]]

很显然这时copy()函数拷贝的值随着原对象的值修改了,而deepcopy()的值没有随着原对象的值修改。
主要是因为deepcopy会将复杂对象的每一层复制一个单独的个体出来对于copy()函数要慎用,慎用。

统一声明:关于原创博客内容,可能会有部分内容参考自互联网,如有原创链接会声明引用;如找不到原创链接,在此声明如有侵权请联系删除哈。关于转载博客,如有原创链接会声明;如找不到原创链接,在此声明如有侵权请联系删除哈。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188180.html原文链接:https://javaforall.net

(5)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【一步一个脚印】Tomcat+MySQL为自己的APP打造服务器(1)服务器环境搭建[通俗易懂]

    【一步一个脚印】Tomcat+MySQL为自己的APP打造服务器(1)服务器环境搭建[通俗易懂]做Android开发一年多了,虽然不敢说有多精通,但也相对熟悉。做久了就会发现Android在行外人眼中是多么高深(包括IOS也一样),但是我们自己知道其实Android和Web前端其实本质上是没有多大的区别,只不过一个是显示在浏览器中,一个是显示在手机上而已。慢慢地,你会发现移动端(Android、IOS、WinPhone、WebAPP)其实涉及到的业务逻辑是很少很少的——无关孰优孰劣,这是分工的不同,移动端毕竟硬件资源有限,适合于简单的计算和交互处理,业务逻辑什么的放在资源更富裕的服

    2022年6月4日
    48
  • 2017年北理工研究生复试总结「建议收藏」

    2017年北理工研究生复试总结「建议收藏」就在昨天还为自己在专家面试环节答题答得非常糟糕的事情感到懊恼不已,今天进入官网一看,我的天,竟然过了,复试成绩竟然77分,仅比第一名差2分。

    2022年4月27日
    37
  • FFmpeg(四) 像素转换相关函数理解[通俗易懂]

    FFmpeg(四) 像素转换相关函数理解[通俗易懂]FFmpeg(四) 像素转换相关函数理解

    2022年4月20日
    41
  • decode和encode函数_python lstrip

    decode和encode函数_python lstrip字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编…

    2022年10月6日
    5
  • CultureInfo中重要的InvariantCulture[通俗易懂]

    CultureInfo中重要的InvariantCulture[通俗易懂]CultureInfo简述CultureInfo类位于System.Globalization命名空间内,这个类和这个命名空间许多人都不了解也认为不需要太多了解,实际上,你写的程序中会经常间接得使用这些类。简单的说:当进行数字,日期时间,字符串匹配时,都会进行CultureInfo的操作,也就是不同的CultureInfo下,这些操作的结果可能会不一样。这里要介绍一下非常容易被忽视的In…

    2022年6月19日
    25
  • windows10安装虚拟机步骤_vmware虚拟机安装win7

    windows10安装虚拟机步骤_vmware虚拟机安装win7**windows10安装虚拟机详细教程****1.安装环境:**windows10**2.安装所需要用到的材料:**材料链接:https://pan.baidu.com/s/1usn2tAPPV3YvAc8NSF9pfg提取码:d6uf(复制这段链接后打开百度网盘手机App,操作更方便哦,想要其他版本的话就去官网下载,操作大同小异)**3.安装步骤:**(1)双击下图文件。(2)弹出下图,点击”下一步”即可。(3)点击“更改”安装位置,可以不用进行修改,本人安装

    2025年11月8日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号