"copy()和deepcopy()有什么区别?"
如果你觉得这是送分题,那就危险了。
最近刷牛客网,发现这道题依然稳居Python高频面试榜。阿里、美团、字节跳动、百度、腾讯、微软、Oracle、Google等公司的Python岗位,也都喜欢从这里开始"试水"。
为什么?
因为它看似简单,实际上考察的是对象、内存、引用三件事。
而真正会Python的人,讲的从来不是API,而是底层逻辑。🔥
📌 今日面试题
Python深拷贝(Deep Copy)和浅拷贝(Shallow Copy)有什么区别?
很多人的第一反应:
浅拷贝复制一层,深拷贝全部复制。
没错。
但如果你的回答只有这一句,大概率拿不到高分。
真正优秀的回答,应该先解释Python变量到底是什么。
Python变量,存的不是数据
这是很多初学者最容易误解的地方。
来看一段代码:
很多人认为:
"b复制了一份a。"
其实没有。
发生的事情只有一件:
b和a同时指向同一个列表对象。
换句话说:
两个变量。
一个对象。
所以:
打印:
结果仍然是:
为什么?
因为修改的是同一块内存。
浅拷贝到底复制了什么?
来看下面这段代码。
import copya = [[1, 2], [3, 4]]b = copy.copy(a)
这里发生了什么?
新的列表创建出来了。
但是里面的小列表,并没有重新创建。
可以理解成:
于是:
最后:
输出:
是不是很意外?
其实一点都不奇怪。
因为:
内层对象还是同一个。
深拷贝为什么不会影响原对象?
换成:
Python会递归复制整个对象。
包括:
✔ 列表
✔ 字典
✔ 元组里的可变对象
✔ 自定义对象
全部重新创建。
这时:
修改任何层级的数据。
都不会影响原对象。
💡 面试官最喜欢追问的问题来了
是不是所有情况都应该使用deepcopy?
答案:
不是。
很多同学觉得:
深拷贝最安全。
于是到处deepcopy。
其实这是一个很大的误区。
为什么?
因为:
deepcopy需要递归整个对象。
对象越复杂。
复制越慢。
内存消耗越高。
如果一个大型配置对象几十MB,
每次都deepcopy,
性能直接下降。
所以:
深拷贝不是万能药。
它只是成本最高的一种复制方式。
再追问一句:为什么Python默认采用引用?
答案其实很简单。
因为:
复制对象,非常昂贵。
想象一下。
一个模型参数。
几个GB。
一个DataFrame。
几百万行。
如果每次赋值都复制一份,
内存瞬间爆炸。
所以:
Python采用引用机制。
真正需要复制的时候,
开发者自己决定。
这是效率。
也是一种设计哲学。
🚀 一个很多人不知道的小知识
Python里面有一种复制,
比deepcopy更常见。
那就是:
不可变对象共享。
例如:
或者:
很多时候,
Python会直接共享对象。
因为:
整数、字符串都是不可变对象。
共享没有风险。
还能节省内存。
所以,
有时候你看到:
竟然是真的。
别惊讶。
这是Python解释器帮你做的优化。
📖 我的观点
这些年带过不少刚入行的开发者,我发现一个有趣的现象。
很多人喜欢记:
甚至把它们背得滚瓜烂熟。
但是一问:
变量为什么会共享对象?
回答却越来越少。
AI时代也是如此。
代码,可以让AI生成。
API,可以让AI补全。
可如果连对象模型、引用关系、内存机制都理解不了,遇到线上Bug,还是会束手无策。
真正优秀的Python工程师,不只是会写代码。
更重要的是,知道代码为什么会这样运行。
这,才是技术人与工具使用者最大的区别。💪
📚 今日知识总结
✅ Python变量保存的是对象引用,而不是对象本身。
✅ = 只是建立新的引用,不会复制对象。
✅ 浅拷贝只复制第一层,可变子对象仍然共享。
✅ 深拷贝递归复制整个对象,互不影响,但性能开销更高。
✅ 开发中不要滥用 deepcopy,按场景选择合适的复制方式。
💬 留个思考题
如果面试官继续追问:
Python函数传参,到底是值传递,还是引用传递?
你会怎么回答?
欢迎在评论区说说你的答案,我们下一期继续拆解大厂Python高频面试题。👇
关注我,每天5分钟,一个Python核心知识点,一个大厂高频面试题,让技术真正成为你的竞争力。 🚀