对于刚从其他编程语言转到python的新手而言,浅拷贝与深拷贝 无疑是一个令人挠头的问题。使用一段时间后,还是觉得浅拷贝与深拷贝是一种有意思的设计,在做能帮助我们把程序编写得比较简洁。例如编写pyqt5程序时,可以把很多变量临时赋值。
但是如果不能把浅拷贝与深拷贝区分清楚乃至理解透彻,那么就会遇到许多莫名其妙的问题。建议初学者花点时间认真体会一下浅拷贝与深拷贝。
下面从“=”,“dict.update()”和“list.append()”三种应用情景,各举了一个例子进行说明。基本结论是:(1)通过深拷贝得到的两个量是不同的对象,不在同一个内存地址,一个发射变化时,另一个不会变。(2)通过浅拷贝得到的两个量是相同的对象,处在同一个内存地址,一个发射变化时,另一个随之变化。
import copy ##2023年04月24日
pduAA = {"原有": 1 }
##********## 1A 赋值
comma1 = {}
comma1["P1"] = pduAA
comma1["P2"] = pduAA
print(id(comma1["P1"] )==id(comma1["P2"]),"同一个内存地址,一变俱变")
##********## 1B深拷贝
comma2 = {}
comma2["P1"] = copy.deepcopy(pduAA)
comma2["P2"] = copy.deepcopy(pduAA)
print("深拷贝:",id(comma2["P1"] )==id(comma2["P2"]),'不同内存地址,独立变化')
##********## 2A 字典的 update ##浅拷贝
comma3 = {}
comma3.update({"P1": pduAA})
comma3.update({"P2": pduAA})
print(id(comma3["P1"] )==id(comma3["P2"]),"同一个内存地址,一变俱变")
##********## 2B 字典的 update ##深拷贝
comma4 = {}
comma4.update({"P1": copy.deepcopy(pduAA)})
comma4.update({"P2": copy.deepcopy(pduAA)})
print("深拷贝 dict update:",id(comma4["P1"] )==id(comma4["P2"]),'不同内存地址,独立变化')
##********## 3A 列表的 append ##浅拷贝
c1c = []
for i in range(2):
c1c.append(pduAA)
print(id(c1c[0] )==id(c1c[1]),"同一个内存地址,一变俱变")
##********## 3B 列表的 append ##深拷贝
c2c=[]
for i in range(2):
c2c.append(copy.deepcopy(pduAA))
print("深拷贝 list append:",id(c2c[0])==id(c2c[1]),'不同内存地址,独立变化')