python学习之【浅拷贝】

前言

上一篇文章,python学习之【继承、封装、多态】主要学习了面向对象的三大特征。这篇文章记录下对python的浅拷贝的学习,下一篇文章接着学习深拷贝。

在这里插入图片描述

简单了解

浅拷贝:python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,原对象与拷贝对象会引用同一个子对象(如果不好理解的话,可以接着往下看两张图)

浅拷贝

我们可以通过列表(可变序列)实现浅拷贝,首先我们创建一个列表a,然后将列表a的id地址以及其浅层元素和深层元素的id地址打印出来:

在这里插入图片描述

对列表a进行浅拷贝:

在这里插入图片描述
由这两张图可以发现,当对列表a进行浅拷贝的时候,列表a指向的内存地址是不改变的(即浅拷贝后产生的对象和原对象都是指向的同一个内存地址);并且无论是原对象列表a的浅层元素还是深层元素,它们拷贝前后都是指向的同一个内存地址。

接着,我们对浅拷贝后产生的对象的浅层元素和深层元素进行更改:

对浅拷贝后产生的对象的浅层元素进行更改
在这里插入图片描述
对浅拷贝后产生的对象的深层元素进行更改

在这里插入图片描述

对于列表浅拷贝和深拷贝的示意图Pythontutor可视化代码工具):

在这里插入图片描述
这里我参考了一个视频讲解,觉得不错,分享给大家~点此查看

由此,我们可以对浅拷贝做一个小结:

浅拷贝只拷贝浅层元素,深层元素的内存地址不改变当对拷贝产生的新的对象的浅层元素进行更改时,原对象的主元素不做改变但是对拷贝后产生的对象的深层对象进行改变时,那么原对象的深层元素的地址就会发生变化。

类的浅拷贝

通过举列表浅拷贝的例子我们不难发现,浅拷贝拷贝的是对象的主元素,即会产生一个指向新的地址的主元素;而子元素不会发生拷贝,因此依然和原来对象指向的地址相同。

那么接下来我们来看一下类的浅拷贝的运用:

# 变量赋值和浅拷贝
class CPU():
    pass

class Disk():
    pass
class Computer():
    # 初始化方法
    def __init__(self,cpu,disk):
        self.cpu=cpu
        self.disk=disk
cpu1=CPU()
cpu2=cpu1
print(cpu1,id(cpu1),type(cpu1))
print(cpu2,id(cpu2),type(cpu2))
'''
<__main__.CPU object at 0x7f883d4d5cd0> 140223120760016
<__main__.CPU object at 0x7f883d4d5cd0> 140223120760016
'''
disk1=Disk()
print('disk1的信息',disk1,id(disk1),type(disk1))
computer1=Computer(cpu1,disk1)
print('computer1的信息',computer1,id(computer1),type(computer1))
# 浅拷贝
import copy
computer2=copy.copy(computer1)
print(computer1,id(computer1),computer1.cpu,computer1.disk)
print(computer2,id(computer2),computer2.cpu,computer2.disk)
'''
浅拷贝中子对象即原类的实例对象的子对象(computer1.cpu  computer1.disk)不拷贝 因此拷贝之后的computer2的参数cpu 和 disk 的内存地址也是指向原来computer1的cpu 和 disk所指向的内存地址的  但是 computer1这个实例对象发生拷贝  也就是产生了一个computer2这个新对象   这个新对象指向的id地址也和原对象的不同
<__main__.Computer object at 0x7f883d4d5d50> <__main__.CPU object at 0x7f883d4d5cd0> <__main__.Disk object at 0x7f883d4d5d10>
<__main__.Computer object at 0x7f883d4d5ed0> <__main__.CPU object at 0x7f883d4d5cd0> <__main__.Disk object at 0x7f883d4d5d10>
'''

在这里插入图片描述
图解过程:
在这里插入图片描述

每篇一语

工欲善其事,必先利其器。
如有不足,感谢指正!

评论 53
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值