德州市住房建设局网站,东莞个人免费建网站,运营小程序的成本有哪些,电力建设工程最好的网站前言
上一篇文章#xff0c;python学习之【继承、封装、多态】主要学习了面向对象的三大特征。这篇文章记录下对python的浅拷贝的学习#xff0c;下一篇文章接着学习深拷贝。 简单了解
浅拷贝#xff1a;python拷贝一般都是浅拷贝#xff0c;拷贝时#xff0c;对象包含的…前言
上一篇文章python学习之【继承、封装、多态】主要学习了面向对象的三大特征。这篇文章记录下对python的浅拷贝的学习下一篇文章接着学习深拷贝。 简单了解
浅拷贝python拷贝一般都是浅拷贝拷贝时对象包含的子对象内容不拷贝因此原对象与拷贝对象会引用同一个子对象如果不好理解的话可以接着往下看两张图
浅拷贝
我们可以通过列表可变序列实现浅拷贝首先我们创建一个列表a然后将列表a的id地址以及其浅层元素和深层元素的id地址打印出来 对列表a进行浅拷贝 由这两张图可以发现当对列表a进行浅拷贝的时候列表a指向的内存地址是不改变的即浅拷贝后产生的对象和原对象都是指向的同一个内存地址并且无论是原对象列表a的浅层元素还是深层元素它们拷贝前后都是指向的同一个内存地址。
接着我们对浅拷贝后产生的对象的浅层元素和深层元素进行更改
对浅拷贝后产生的对象的浅层元素进行更改 对浅拷贝后产生的对象的深层元素进行更改 对于列表浅拷贝和深拷贝的示意图Pythontutor可视化代码工具 这里我参考了一个视频讲解觉得不错分享给大家~点此查看。
由此我们可以对浅拷贝做一个小结 浅拷贝只拷贝浅层元素深层元素的内存地址不改变当对拷贝产生的新的对象的浅层元素进行更改时原对象的主元素不做改变但是对拷贝后产生的对象的深层对象进行改变时那么原对象的深层元素的地址就会发生变化。 类的浅拷贝
通过举列表浅拷贝的例子我们不难发现浅拷贝拷贝的是对象的主元素即会产生一个指向新的地址的主元素而子元素不会发生拷贝因此依然和原来对象指向的地址相同。
那么接下来我们来看一下类的浅拷贝的运用
# 变量赋值和浅拷贝
class CPU():passclass Disk():pass
class Computer():# 初始化方法def __init__(self,cpu,disk):self.cpucpuself.diskdisk
cpu1CPU()
cpu2cpu1
print(cpu1,id(cpu1),type(cpu1))
print(cpu2,id(cpu2),type(cpu2))__main__.CPU object at 0x7f883d4d5cd0 140223120760016
__main__.CPU object at 0x7f883d4d5cd0 140223120760016disk1Disk()
print(disk1的信息,disk1,id(disk1),type(disk1))
computer1Computer(cpu1,disk1)
print(computer1的信息,computer1,id(computer1),type(computer1))
# 浅拷贝
import copy
computer2copy.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图解过程
每篇一语
工欲善其事必先利其器。 如有不足感谢指正