近期在日常工作中使用到python中拷贝的问题,之前都是一知半解的理解状态,今天闲来无事,在网上查了一些博文把相关的知识点整理并验证了一下,话不多说,看下文~~:
关于复制在python中有常用三种形式:
第一种:=
第二种:copy()
第三种:deepcopy()
下面逐一进行说明,并以示例辅助理解:
第一种情况:直接赋值 “=”

执行结果如下:

可见lis2与lis指向的对象完全相同,为了进一步说明,现在对lis进行修改操作

执行结果如下:

总结:
在使用“=” 赋值的过程中,lis2指向与lis指向完全相同,故lis通过直接修改的方式进行原对象的修改,则lis2也会跟着修改。

第二种情况:浅拷贝copy()

执行结果如下:

由上可见:lis3指向了新的对象,但是对象里面保存的元素还是与lis指向相同,现在对lis进行修改

执行结果如下:

总结:进行浅拷贝即copy()时,,拷贝的数据(lis3)中第一层元素(是简单的数据类型 即数字型,字符串类型时)并不会随着原数据(lis)的修改而变化,但是第二层元素(复杂的数据类型:列表,字典类型)会跟着原数据(lis)的修改而变化,以下有图进一步说明原因:

第三种情况:深拷贝 deepcopy()

执行结果如下:

如上:进行深拷贝以后,复制数据lis4也并不是完全创建了所有新的对象,比如第一个元素“a”,lis与lis4引用的就是同一个对象,对于嵌套的列表元素[1,2]会进行完全的新创建,这是不同于浅拷贝的地方,现在进行数据修改

执行结果如下:
![]()
总结:深拷贝导致嵌套的列表元素进行新的创建 ,所以原数据进行修改后,不会影响复制的数据list4的变化

以上是我个人的理解,有不妥的地方欢迎大家指正!
本文介绍了Python中三种常见的拷贝方式:直接赋值、浅拷贝`copy()`和深拷贝`deepcopy()`。通过示例展示了它们的区别,强调直接赋值会导致两个对象指向同一内存地址,浅拷贝仅拷贝一层元素,深层元素如列表仍共享内存,而深拷贝则创建完全独立的对象副本,避免了原数据修改的影响。
717

被折叠的 条评论
为什么被折叠?



