1. 程式人生 > 其它 >類的淺拷貝與深拷貝

類的淺拷貝與深拷貝

變數的賦值操作:

  • 只是形成兩個變數,實際上還是指向同一個物件
#變數的賦值操作
a=10
b=10
print(id(a)) #1775575198288
print(id(b)) #1775575198288

class CPU:
    pass
class Disk:
    pass
class Computer(CPU,Disk):
    def __init__(self,cpu,disk):
        self.cpu=cpu
        self.disk=disk

#變數的賦值
cpu1=CPU()
cpu2=cpu1
#可以發現,兩個變數儲存的id值都一樣,都是指向那個變數
print(cpu1,id(cpu1))#1965582204880
print(cpu2,id(cpu2))#1965582204880

運算結果:

1965576579664
1965576579664
<__main__.CPU object at 0x000001C9A5D43FD0> 1965582204880
<__main__.CPU object at 0x000001C9A5D43FD0> 1965582204880

淺拷貝:

  • python拷貝一般都是淺拷貝,拷貝時,物件包含的子物件內容不拷貝。因此,源物件與拷貝物件會引起同一個子物件
  • python的拷貝如果沒有特殊說明,都是淺拷貝
#類的淺拷貝
print('__________________淺拷貝___________________')
disk=Disk()
print(id(disk))
computer=Computer(cpu1,disk)
#淺拷貝
import  copy
computer2=copy.copy(computer)
print(computer,computer.cpu,computer.disk)
print(computer2,computer2.cpu,computer2.disk)

運算結果:

__________________淺拷貝___________________
2210778671712
<__main__.Computer object at 0x00000202BCAD6940> <__main__.CPU object at 0x00000202BCAD6FD0> <__main__.Disk object at 0x00000202BCAD6A60>
<__main__.Computer object at 0x00000202BCAD6850> <__main__.CPU object at 0x00000202BCAD6FD0> <__main__.Disk object at 0x00000202BCAD6A60>

#可以發現,在該運算結果中,只有computer和computer2的id值不同,其他子物件是一樣的,也就是說子物件在記憶體中僅有一份

深拷貝:

  • 使用copy模組的deepcopy函式,遞迴拷貝物件中包含的子物件,源物件和拷貝物件所有的子物件也不相同
#類的深拷貝
print('__________________深拷貝_____________________')
computer3=copy.deepcopy(computer)
print(computer,computer.cpu,computer.disk)
print(computer3,computer3.cpu,computer3.disk)

執行結果:

__________________深拷貝_____________________
<__main__.Computer object at 0x0000024E2E1E6940> <__main__.CPU object at 0x0000024E2E1E6FD0> <__main__.Disk object at 0x0000024E2E1E6A60>
<__main__.Computer object at 0x0000024E2E1E6760> <__main__.CPU object at 0x0000024E2E1E63D0> <__main__.Disk object at 0x0000024E2E1E6370>

可以發現不僅僅computer和computer3的id不同,他們的子物件的id也都不同(disk/cpu)。也就是說,深拷貝不僅僅複製了一份computer的例項物件,還拷貝了源物件的所有子物件