变量的赋值操作
只是形成两个变量,实际上还是指向同一个对象
class Cpu:
pass
cpu1 =Cpu()
cpu2 = cpu1
print(cpu1,id(cpu1))
print(cpu2,id(cpu2))
2021.9.12
运行结果
可以看到两个变量的内存地址都一样,所以变量的赋值操作实际上的结果是将一个对象放到两个变量中去储存。
示意图
浅拷贝
Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,源对象与拷贝对象会引用同一个子对象。
class Cpu:
pass
class Disk:
pass
class Computer:
def __init__(self,cpu,disk):
self.cpu = cpu
self.disk = disk
cpu =Cpu()
disk = Disk()
computer = Computer(cpu,disk)
import copy
computer2 = copy.copy(computer)
print(computer,computer.cpu,computer.disk)
print(computer2,computer2.cpu,computer2.disk)
2021.9.12
这里的被拷贝的computer对象叫做源对象,cpu和disk对象叫做子对象,而computer2对象就叫做拷贝对象。
运行结果
可以看到,computer和computer2的内存地址不同,但是两者的子对象的内存地址不同,因而浅拷贝不会拷贝子对象。
示意图
深拷贝
递归拷贝对象中包含的子对象,源对象和拷贝对象中的子对象也不相同。
class Cpu:
pass
class Disk:
pass
class Computer:
def __init__(self,cpu,disk):
self.cpu = cpu
self.disk = disk
cpu =Cpu()
disk = Disk()
computer = Computer(cpu,disk)
import copy
computer3 = copy.deepcopy(computer)
print(computer,computer.cpu,computer.disk)
print(computer3,computer3.cpu,computer3.disk)
2021.9.12
运行结果
可以看到源对象与拷贝对象,以及他们的子对象的内存地址都不同,因为深拷贝把子对象也拷贝了。
示意图
|