python中的深拷贝和浅拷贝

来源:互联网 发布:2017淘宝刷不了单 编辑:程序博客网 时间:2024/05/27 09:46

在叙述深拷贝和浅拷贝前,我觉得很有必要说一下变量赋值的原理。首先看一下下面的代码例子。

赋值原理

a = 3;b = a;id(b) ==id(a)

结果是True,其实有过其他语言学习的人很容易就明白。赋给a的是3这个数的地址,而b=a 也只是把a内存的地址赋值给b,所以两者此时存的数据(或者叫地址)是一样的。这就造成了无论你修改a或b结果都是对同一个数据进行操作的。所以无法保证,a的修改不影响到b,或者相反。

怎样实现不影响源的拷贝

如果不想改变源的值,有两种方法:切片 和 copy模块。切片技术应用于所有的序列,包括:列表、字符串、元祖 。但切片不能应用于字典。对字典只能使用copy()方法或deepcopy()方法。什么是切片呢?其实就是取出一个范围内的元素。

浅拷贝

只拷贝顶级的对象,或者说,只拷贝父级对象。也就是说父级对象里还有子对象的时候,其实也是把该父级对象的地址赋给了新的变量,而不是把元素值赋给新变量,这样一来就造成了一种隐含的错误,当我们对有子对象的父级对象进行操作时,会同时影响源和目的对象。换句话说如果父级对象下没有子对象,其实浅拷贝和深拷贝是一样的。见下面的验证。

程序

import copysrc =  [1,'lemon','a',45]dst_1 = copy.copy(src)dst_2 = copy.deepcopy(src)dst_1[2] ='love you'#src 和dst_1各自独立 print(src)print(dst_1)print(dst_2)

你会发现dst_1和src并不影响,两者在独立的内存空间中。

深拷贝

但是如果父对象下有子对象,这样的情况,倘若你修改的就是其子对象,这时也会同时影响两个变量的。
所以此时只能用深拷贝进行拷贝,使两个变量指向的内存空间不一样。
深拷贝:拷贝所有对象,顶级对象及其嵌套对象。或者说:父级对象及其子对象

程序

src =[23,'mike','a',[1,2,3]]import copydst_1 = copy.copy(src)dst_2 = copy.deepcopy(src)dst_1[3][0]=99#此时src 的元素和dst_1的元素一样的改变了print(src)print(dst_1)print(dst_2)
原创粉丝点击