python初识之深浅拷贝

来源:互联网 发布:sql强数据库破解路由器 编辑:程序博客网 时间:2024/06/08 05:00

浅拷贝

使用对象.copy()实现浅拷贝,该对象可以为任意类型,该对象中的元素也可为任意类型,浅拷贝只拷贝第一层

如:

a = ['a', 1, 'b', 2]b = a.copy()    #对列表a进行浅拷贝b[0]='abc'      #修改拷贝后的b中第一层元素a为abcprint(a)        #输出打印['a', 1, 'b', 2]print(b)        #['abc', 1, 'b', 2]'''    从输出打印来看,修改对象b中第一层的字符串a为abc,只有b对象只发生改变    而a对象丝毫不受影响,说明浅拷贝修改第一层数据不会对a产生影响    '''

在内存中的实现方式参考下图:

说明在拷贝之后,b对象的所有元素指向了a中的所有元素的指针,当改变b[0]元素的值为abc后,内存会开辟一块新的内存存放abc,此时,b[0]就指向了abc这一元素的指针,但是a[0]的指针此时并没有任何变化,所以只是对象b的元素发生了改变。

若a中存在嵌套列表或字典,浅拷贝后,对嵌套列表或字典修改后如下:

a = [['a', 'abc'], 1, 'b', 2]       #a中存在嵌套列表b = a.copy()                        #对其进行浅拷贝b[0][1] = 123                       #对拷贝后的嵌套列表进行操作 #对拷贝后的对象b修改其嵌套的列表后,a和b的元素均发生改变print(a)        #输出结果:[['a', 123], 1, 'b', 2]print(b)        #输出结果:[['a', 123], 1, 'b', 2]

这里写图片描述

由上图可看出,对象b对a进行拷贝后,只拷贝了第一层,但是嵌套的列表中元素属于第二层,若对第二层元素进行修改,则第二层元素地址发生改变,此时,对象a的元素就会发生改变 此时就可说明,浅拷贝只拷贝第一层,若修改第二层及以上数据,a对象也会随之修改

深拷贝

#首先需引入copyimport copya = [['a', 'abc'], 1, 'b', 2]b=copy.deepcopy(a)  #使用copy.deepcopy(需要拷贝的对象),此时就完成了深拷贝b[0][1] = 123       #对拷贝后的嵌套列表进行操作# 从输出结果上可以看到,深拷贝后的对象,不论如何对其元素进行操作,都不会影响对象a,即深拷贝是拷贝所有层print(a)            #输出结果:[['a', 'abc'], 1, 'b', 2]print(b)            #输出结果:[['a', 123], 1, 'b', 2]
原创粉丝点击