python学习——【第十二弹】

时间:2023-02-22 19:58:40

前言

上一篇文章 ​​python学习——【第十一弹】​​中我们了解了 python中的浅拷贝,这篇文章接着学习python中的深拷贝

简单回顾

我们知道在python中的拷贝一般都是浅拷贝;浅拷贝只拷贝对象的主层元素,深层元素不进行拷贝。

python学习——【第十二弹】

而python中的深拷贝(deepcopy)   不仅会拷贝对象的主层元素,深层元素也会拷贝。

举例

我们同样先举列表进行深拷贝的例子,注意在进行深拷贝时我们需要先引入一个 copy 模板块:

#深层拷贝需要引入一个 拷贝python copy模板块
import copy
import copy

a=[11,22,33,[1,2,3,[4,5]]]
d=copy.deepcopy(a)
print('--------------a的相关信息-------------')
print(a,id(a)) #[11, 22, 33, [1, 2, 3, [4, 5]]] 2196544302400
print('------------a中元素的相关信息--------------')
print(a[0],id(a[0]),a[1],id(a[1]),a[2],id(a[2]))
#11 140721422918760 22 140721422919112 33 140721422919464


print('-------------d的相关信息--------------------')
print(d,id(d)) #[11, 22, 33, [1, 2, 3, [4, 5]]] 2196544300928
print('-------------d中元素的相关信息----------------')
print(d[0],id(d[0]),d[1],id(d[1]),d[2],id(d[2]))

# 11 140721422918760 22 140721422919112 33 140721422919464

由于列表是可变序列,因此我们无法从id地址上看出内存地址的关系图;但是我们可以通过改变拷贝后得到的对象d的值来查看内存的变化情况:

print('-----------------改变深拷贝后的浅层元素和深层元素-----------------')
d[2]=100
print('改变拷贝后的对象的浅层元素后的a的相关信息:',a[2],id(a[2]))
#改变拷贝后的对象的浅层元素后的a的相关信息: 33 140721422919464

d[3][1]=999
d[3][3][1]=888
print('改变拷贝后的对象d的深层元素后的a的相关信息:',a[3][1],id(a[3][1]))
# 改变拷贝后的对象d的深层元素后的a的相关信息: 2 140721422918472
print(a[3][3][1],id(a[3][3][1]))
# 5 140721422918568

通过运行结果我们可以看出:无论是改变d的浅层元素还是深层元素,原对象a的id地址都不会发生改变,这就说明,深拷贝deepcopy 会将对象的深层对象和表层对象都拷贝,形成一个新的对象。

因此它的内存图是这样的:

python学习——【第十二弹】

类的深拷贝

# python中的深拷贝
class CPU():
pass
class Disk():
pass
class Computer():
def __init__(self,cpu,disk):
self.cpu=cpu
self.disk=disk
cpu1=CPU()
disk1=Disk()
print('cpu1的信息:',cpu1,id(cpu1))
print('disk1的信息:',disk1,id(disk1))
'''
cpu1的信息: <__main__.CPU object at 0x7f7b6e4fca90> 140168108427920
disk1的信息: <__main__.Disk object at 0x7f7b6e4fcb10> 140168108428048
'''
# 不要忘记传参
computer1=Computer(cpu1,disk1)
# 传入拷贝模板
import copy
computer3=copy.deepcopy(computer1)
print('computer1的相关信息',computer1,id(computer1),computer1.cpu,computer1.disk)
print('---------------深拷贝后的对象的信息——computer3-------------\n')
print('computer3的相关信息',computer3,id(computer3),computer3.cpu,computer3.disk)
'''
computer1的相关信息 <__main__.Computer object at 0x7f92ae4b9bd0> 140267966143440 <__main__.CPU object at 0x7f92ae4b9ad0> <__main__.Disk object at 0x7f92ae4b9b50>
computer3的相关信息 <__main__.Computer object at 0x7f92ae4b9c90> 140267966143632 <__main__.CPU object at 0x7f92ae4bd890> <__main__.Disk object at 0x7f92ae468c50>
'''

同样的,我们画出相应的内存图:

python学习——【第十二弹】

每篇一语

凡事预则立,不预则废!

如有不足,感谢指正!