python初识之深浅拷贝

浅拷贝

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

如:

a = ['a', 1, 'b', 2]
b = a.copy()    #对列表a进行浅拷贝
b[0]='abc'      #修改拷贝后的b中第一层元素a为abc
print(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 copy
a = [['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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值