近期在日常工作中使用到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的变化
以上是我个人的理解,有不妥的地方欢迎大家指正!