京公网安备 11010802034615号
经营许可证编号:京B2-20210330
作者:麦叔
来源:麦叔编程
在【#067】我们聊到了深度copy和浅度copy,如果还没看请点击文末查看。
我们有一个对象Coder(编程者),它包含昵称,编程年数,以及所会的编程语言列表:
class Coder: def __init__(self, nickname, experience_years, skills): self.nickname = nickname self.experience_years = experience_years self.skills = skills
其中skills是一个列表,里面包含至少一种编程语言。
我们创建一个对象maishu:
maishu = Coder('maishu', 15, ['Java', 'Ruby', 'Python', 'Shell', 'Swift', 'Objective-C', 'Flutter', 'JavaScript', 'R', 'C', 'C++'])
有一位麦友,他的情况和maishu很相似,除了昵称不一样。我们想要复制一份maishu对象,这样就不用重新创建了。
我给大家留了一个问题:
上面复制maishu的情况,应该用深copy还是浅copy呢?
评论区里的答案大都很调皮:
麦友@梦终空说:
浅copy! 这样复制了别人的知识我不用学习也能跟随别人一起更新!
麦友@予瑕说:
浅拷贝好啊,可以随着原数据的更新而更新!
麦说@日常磕盐说:
麦叔真是个有趣的人,我支持浅copy!
他们的回复虽然调皮,而且也是不对的(),但也指出了浅copy的好处:可以共用数据。
在上面的例子中,应该用深copy,因为每个人的技能是不同的。感谢麦友@梁显浚HinChunLeung给出正确答案。
麦友@Lonely丶Enderman还指出了浅copy可能出错的一个地方:
浅拷贝的话,如果两个对象都写了析构函数,就会报错。原理是原对象里的属性已经被释放了,浅拷贝出来的对象就会重复释放(浅拷贝成员指向原对象)。
不过在Python中很少写析构函数,基本上都是让对象自动垃圾回收的,这个问题存在的概率不大。不过理解这一点还是很重要的。只有理解比较深入的人才能理解这一点。
Python中深copy和浅copy的函数分别copy模块中的copy()和deepcopy()。
先看看浅copy的例子:
import copy class Coder: def __init__(self, nickname, experience_years, skills): self.nickname = nickname
self.experience_years = experience_years
self.skills = skills
maishu = Coder('maishu', 15, ['Java', 'Ruby', 'Python', 'Shell', 'Swift', 'Objective-C', 'Flutter', 'JavaScript', 'R', 'C', 'C++'])
guishu = copy.copy(maishu)
print(f'龟叔的名字是:{guishu.nickname}')
guishu.nickname = '龟叔' print(f'麦叔的名字是:{maishu.nickname}')
print(f'龟叔的名字是:{guishu.nickname}')
guishu.skills.append('易语言')
print(f'麦叔的技能是:{maishu.skills}')
print(f'龟叔的技能是:{guishu.skills}')
运行结果:
龟叔的名字是:maishu 麦叔的名字是:maishu 龟叔的名字是:龟叔
麦叔的技能是:['Java', 'Ruby', 'Python', 'Shell', 'Swift', 'Objective-C', 'Flutter', 'JavaScript', 'R', 'C', 'C++', '易语言'] 龟叔的技能是:['Java', 'Ruby', 'Python', 'Shell', 'Swift', 'Objective-C', 'Flutter', 'JavaScript', 'R', 'C', 'C++', '易语言']
解释一下:
再来看看深copy的例子,和上面唯一的区别就是改成调用deepcopy()函数。
import copy class Coder: def __init__(self, nickname, experience_years, skills): self.nickname = nickname
self.experience_years = experience_years
self.skills = skills
maishu = Coder('maishu', 15, ['Java', 'Ruby', 'Python', 'Shell', 'Swift', 'Objective-C', 'Flutter', 'JavaScript', 'R', 'C', 'C++'])
guishu = copy.deepcopy(maishu) #唯一改动 print(f'龟叔的名字是:{guishu.nickname}')
guishu.nickname = '龟叔' print(f'麦叔的名字是:{maishu.nickname}')
print(f'龟叔的名字是:{guishu.nickname}')
guishu.skills.append('易语言')
print(f'麦叔的技能是:{maishu.skills}')
print(f'龟叔的技能是:{guishu.skills}')
再次运行,发现maishu的技能不受guishu影响了:
龟叔的名字是:maishu 麦叔的名字是:maishu 龟叔的名字是:龟叔
麦叔的技能是:['Java', 'Ruby', 'Python', 'Shell', 'Swift', 'Objective-C', 'Flutter', 'JavaScript', 'R', 'C', 'C++'] 龟叔的技能是:['Java', 'Ruby', 'Python', 'Shell', 'Swift', 'Objective-C', 'Flutter', 'JavaScript', 'R', 'C', 'C++', '易语言']
因为它们的数据是安全独立的。
应该用哪个取决于你的实际业务需求。只要理解了它们的本质区别,就可以合理运用。
说几个要点:
其实,人生亦如此!朋友,甚至亲情之间,也要把握好边界,懂得深浅。尤其是开玩笑的时候,更要懂得深浅,很多冲突起源于玩笑。总之,懂的深浅,才能游刃有余!
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在数据指标体系搭建工作中,从业者常困惑于指标搭建的核心逻辑:究竟是依托一线零散数据自下而上汇总指标,还是基于战略目标自上 ...
2026-07-31在数据分析、问卷研究、实验复盘、业务建模的工作中,大多数人最关注的是“用什么统计方法”:是做T检验、方差分析、卡方检验, ...
2026-07-31 许多数据分析师精通Excel函数和SQL查询,但当面对一张上万行的销售明细表,要快速回答“哪个地区销量最高”“哪款产品增长最 ...
2026-07-31在问卷调研的数据分析流程中,“先检验信效度,再开展进阶统计分析”是通用的规范逻辑。很多从业者会听到“问卷效度高,后续可以 ...
2026-07-30【核心关键词】大数据、统计学、专业、毕业生、论文、课程、计算机、建模、知识、数据分析、机器学习、数据科学、大数据技术、 ...
2026-07-30 很多数据分析师掌握了Excel函数、会写SQL查询,但当被问到“数据从哪里来”“数据加工有哪些步骤”“如何使用分析工具连接数 ...
2026-07-30在业务数据分析中,按天拆分统计夜间时段的数据是高频需求——比如电商夜间订单监测、平台夜间用户活跃度分析、运维系统夜间异常 ...
2026-07-29在机器学习建模与特征工程实践中,判断不同特征对模型预测效果的贡献度,是特征筛选、模型解释、业务归因的核心环节。特征置换重 ...
2026-07-29 很多数据分析师精通Excel单元格操作,但当被问到“表结构数据的基本处理单位是什么”“字段和记录的本质区别”“为什么表结 ...
2026-07-29【核心关键词】岗位、数字化、经验、课程、方法论、决策、企业、大方向、数据分析、销售管理、理论知识、思维方式、分析销售、 ...
2026-07-28在问卷调研、用户分群、效果对比等业务数据分析中,分类变量的关联性与差异性验证是高频需求。卡方检验作为针对离散分类数据的经 ...
2026-07-28 数据分析师八成以上的时间在和数据表格打交道,但许多人拿到Excel后习惯性地先算、先分析,结果回头发现漏了一列关键数据, ...
2026-07-28在Excel数据分析与报表制作中,数据透视表是快速完成多维度汇总、分组统计的核心工具。很多从业者在得到透视表汇总结果后,为了 ...
2026-07-27 很多数据分析师每天与Excel打交道,但当被问到“表格结构数据的基本处理单位是什么”“数据类型误判会引发哪些分析错误”“ ...
2026-07-27当下,我们已然步入数据要素价值全面释放的智能时代。数据不再只是零散的数字记录,更是驱动新质生产力运转的核心动能、滋养人工 ...
2026-07-27【核心关键词】客户、数据分析、指标体系、数据采集、数据指标、业务数据、分析思路、业务需求、分析方法 【专访摘要】本次 CDA ...
2026-07-24在数据分析、业务建模与数字化运营体系中,原始业务数据普遍存在缺失、重复、异常、口径不一致等质量问题,直接用于分析与建模会 ...
2026-07-24 很多数据分析师能熟练计算均值、标准差,但当被问到“如何用一张图让业务方3秒内看懂核心结论”“面对不同数据类型该怎么选 ...
2026-07-24在数据驱动的精细化运营体系中,指标是业务判断、效果复盘、策略优化的核心依据。随着企业数据化程度提升,指标数量持续膨胀,但 ...
2026-07-23在用户运营与产品增长体系中,留存是衡量产品真实价值与用户粘性的核心标尺,也是决定用户生命周期价值、获客投产比的底层因素。 ...
2026-07-23