对比三种操作:
变量的赋值操作 只是形成两个变量,实际上还是指向同一个对象 浅拷贝 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