关于浅拷贝与深拷贝的初步学习笔记

文章介绍了Python中浅拷贝和深拷贝的概念,对于从其他编程语言转向Python的开发者来说,这是个重要的概念。文中通过示例展示了如何使用`copy`模块的`deepcopy()`函数创建深拷贝,以及浅拷贝在`dict.update()`和`list.append()`操作中的表现。强调了理解这两者差异的重要性,因为它们影响着程序中对象的变更行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于刚从其他编程语言转到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]),'不同内存地址,独立变化')
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值