对比三种操作:

  1. 变量的赋值操作
  • 只是形成两个变量,实际上还是指向同一个对象
  1. 浅拷贝
  • Python的拷贝一般都是浅拷贝。拷贝时,对象包含的子对象内容不拷贝。因此,源对象和拷贝对象会引用同一个子对象。
  1. 深拷贝
  • 需要使用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>

程序说明:

  1. 变量赋值,只是复制了一个变量,变量指向的对象是没有变化的,所以打印的两个内存地址是一样的。
  2. 浅拷贝操作,m2 = copy.copy(m1),会将m1指向的对象重新赋值一份,同时让m2指向这个新复制的对象,子对象cpuscreen不发生变动,故m1m2打印的地址不一样,m1.cpum2.cpu打印的地址一样。
  3. 深拷贝操作,copy.deepcopy(m1),不仅当前的对象会重新复制,而且对象的子对象也会递归复制,所以两次打印的地址都不一样。

示意图:
示意图


备注:
更多精彩博客,请访问:聂发俊的技术博客
对应视频教程,请访问:python400
完整markdown笔记,请访问: python400_learn_github