对比三种操作:
- 变量的赋值操作
- 只是形成两个变量,实际上还是指向同一个对象
- 浅拷贝
- Python的拷贝一般都是浅拷贝。拷贝时,对象包含的子对象内容不拷贝。因此,源对象和拷贝对象会引用同一个子对象。
- 深拷贝
- 需要使用Python的copy模块中的deepcopy函数,递归拷贝对象中包含的子对象。源对象和拷贝对象所有的子对象也不同。
深拷贝耗费的成本相对大一些,没有必要,不要使用。
示例代码:
# 测试对象的浅拷贝和深拷贝
import copy
class Mobile:
def __init__(self, cpu, screen):
self.cpu = cpu
self.screen = screen
class CPU:
def calculate(self):
print("cpu执行计算程序")
class Screen:
def show(self):
print("屏幕显示")
c1 = CPU()
c2 = c1
print("变量赋值")
print(c1)
print(c2)
print('--' * 20)
print("浅拷贝")
s1 = Screen()
m1 = Mobile(c1, s1)
m2 = copy.copy(m1)
print(m1)
print(m2)
print(m1.cpu)
print(m2.cpu)
print('--' * 20)
print("深拷贝")
m3 = copy.deepcopy(m1)
print(m1)
print(m3)
print(m1.cpu)
print(m3.cpu)
运行结果:
变量赋值
<__main__.CPU object at 0x000001815DE78688>
<__main__.CPU object at 0x000001815DE78688>
----------------------------------------
浅拷贝
<__main__.Mobile object at 0x000001815DEDCF88>
<__main__.Mobile object at 0x000001815DEDF508>
<__main__.CPU object at 0x000001815DE78688>
<__main__.CPU object at 0x000001815DE78688>
----------------------------------------
深拷贝
<__main__.Mobile object at 0x000001815DEDCF88>
<__main__.Mobile object at 0x000001816CEBB108>
<__main__.CPU object at 0x000001815DE78688>
<__main__.CPU object at 0x000001816CE14848>
程序说明:
- 变量赋值,只是复制了一个变量,变量指向的对象是没有变化的,所以打印的两个内存地址是一样的。
- 浅拷贝操作,
m2 = copy.copy(m1)
,会将m1指向的对象重新赋值一份,同时让m2指向这个新复制的对象,子对象cpu
和screen
不发生变动,故m1
和m2
打印的地址不一样,m1.cpu
和m2.cpu
打印的地址一样。 - 深拷贝操作,
copy.deepcopy(m1)
,不仅当前的对象会重新复制,而且对象的子对象也会递归复制,所以两次打印的地址都不一样。
示意图:
备注:
更多精彩博客,请访问:聂发俊的技术博客
对应视频教程,请访问:python400
完整markdown笔记,请访问: python400_learn_github