变量的赋值:只是形成两个变量,实际上还是指向同一个对象
浅拷贝:会产生一个新对象;拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象
深拷贝:使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同
代码实例:
class Cpu():
pass
class Disk():
pass
class Computer():
def __init__(self,cpu,disk):
self.cpu=cpu
self.disk=disk
cpu=Cpu()
disk=Disk()
com=Computer(cpu,disk)
com1=com
# 对象复赋值后,指向的内存地址不变
print(com) # 以十六进制打印对象的内存地址
print(com1)
print(id(com)) # 以十进制打印对象的内存地址
print(id(com1))
# 子对象的变化
print(com,'子对象的内存地址:',com.cpu,com.disk)
print(com1,'子对象的内存地址:',com1.cpu,com1.disk)
# 拷贝产生的新对象没有开心的内存,还是指向原来的内存
print('类对象的浅拷贝','-'*66)
# 类对象的浅拷贝
import copy
com2=copy.copy(com) # com2是新产生的对象,com2的子对象,cpu,disk不变
print(com)
print(com2) # 新老对象不同,开了新内存
print()
print(com.cpu)
print(com2.cpu) # 相同
print()
print(com.disk)
print(com2.disk) # 相同
print('类对象的深拷贝','-'*66)
# 类对象的深拷贝,子对象也会被重新创建
com3=copy.deepcopy(com)
print(com)
print(com3) # 新老对象不同,开了新内存
print()
print(com.cpu)
print(com3.cpu) # 不相同
print()
print(com.disk)
print(com3.disk) # 不相同