当前位置:首页>python>面试官问:"Python深拷贝和浅拷贝有什么区别?"99%的人答错了……

面试官问:"Python深拷贝和浅拷贝有什么区别?"99%的人答错了……

  • 2026-10-11 06:26:29
面试官问:"Python深拷贝和浅拷贝有什么区别?"99%的人答错了……

"copy()和deepcopy()有什么区别?"

如果你觉得这是送分题,那就危险了。

最近刷牛客网,发现这道题依然稳居Python高频面试榜。阿里、美团、字节跳动、百度、腾讯、微软、Oracle、Google等公司的Python岗位,也都喜欢从这里开始"试水"。

为什么?

因为它看似简单,实际上考察的是对象、内存、引用三件事。

而真正会Python的人,讲的从来不是API,而是底层逻辑。🔥


📌 今日面试题

Python深拷贝(Deep Copy)和浅拷贝(Shallow Copy)有什么区别?

很多人的第一反应:

浅拷贝复制一层,深拷贝全部复制。

没错。

但如果你的回答只有这一句,大概率拿不到高分。

真正优秀的回答,应该先解释Python变量到底是什么。


Python变量,存的不是数据

这是很多初学者最容易误解的地方。

来看一段代码:

a = [1, 2, 3]b = a

很多人认为:

"b复制了一份a。"

其实没有。

发生的事情只有一件:

b和a同时指向同一个列表对象。

换句话说:

两个变量。

一个对象。

所以:

b.append(4)

打印:

print(a)

结果仍然是:

[1, 2, 3, 4]

为什么?

因为修改的是同一块内存。


浅拷贝到底复制了什么?

来看下面这段代码。

import copya = [[1, 2], [3, 4]]b = copy.copy(a)

这里发生了什么?

新的列表创建出来了。

但是里面的小列表,并没有重新创建。

可以理解成:

外层列表 ✔ 新建内层对象 ✘ 共用

于是:

b[0].append(100)

最后:

print(a)

输出:

[[1,2,100],[3,4]]

是不是很意外?

其实一点都不奇怪。

因为:

内层对象还是同一个。


深拷贝为什么不会影响原对象?

换成:

copy.deepcopy(a)

Python会递归复制整个对象。

包括:

✔ 列表

✔ 字典

✔ 元组里的可变对象

✔ 自定义对象

全部重新创建。

这时:

修改任何层级的数据。

都不会影响原对象。


💡 面试官最喜欢追问的问题来了

是不是所有情况都应该使用deepcopy?

答案:

不是。

很多同学觉得:

深拷贝最安全。

于是到处deepcopy。

其实这是一个很大的误区。

为什么?

因为:

deepcopy需要递归整个对象。

对象越复杂。

复制越慢。

内存消耗越高。

如果一个大型配置对象几十MB,

每次都deepcopy,

性能直接下降。

所以:

深拷贝不是万能药。

它只是成本最高的一种复制方式。


再追问一句:为什么Python默认采用引用?

答案其实很简单。

因为:

复制对象,非常昂贵。

想象一下。

一个模型参数。

几个GB。

一个DataFrame。

几百万行。

如果每次赋值都复制一份,

内存瞬间爆炸。

所以:

Python采用引用机制。

真正需要复制的时候,

开发者自己决定。

这是效率。

也是一种设计哲学。


🚀 一个很多人不知道的小知识

Python里面有一种复制,

比deepcopy更常见。

那就是:

不可变对象共享。

例如:

a = 100b = 100

或者:

a = ”python”b = ”python”

很多时候,

Python会直接共享对象。

因为:

整数、字符串都是不可变对象。

共享没有风险。

还能节省内存。

所以,

有时候你看到:

id(a) == id(b)

竟然是真的。

别惊讶。

这是Python解释器帮你做的优化。


📖 我的观点

这些年带过不少刚入行的开发者,我发现一个有趣的现象。

很多人喜欢记:

  • list.copy()
  • copy.copy()
  • copy.deepcopy()

甚至把它们背得滚瓜烂熟。

但是一问:

变量为什么会共享对象?

回答却越来越少。

AI时代也是如此。

代码,可以让AI生成。

API,可以让AI补全。

可如果连对象模型、引用关系、内存机制都理解不了,遇到线上Bug,还是会束手无策。

真正优秀的Python工程师,不只是会写代码。

更重要的是,知道代码为什么会这样运行。

这,才是技术人与工具使用者最大的区别。💪


📚 今日知识总结

✅ Python变量保存的是对象引用,而不是对象本身。

✅ = 只是建立新的引用,不会复制对象。

✅ 浅拷贝只复制第一层,可变子对象仍然共享。

✅ 深拷贝递归复制整个对象,互不影响,但性能开销更高。

✅ 开发中不要滥用 deepcopy,按场景选择合适的复制方式。


💬 留个思考题

如果面试官继续追问:

Python函数传参,到底是值传递,还是引用传递?

你会怎么回答?

欢迎在评论区说说你的答案,我们下一期继续拆解大厂Python高频面试题。👇

关注我,每天5分钟,一个Python核心知识点,一个大厂高频面试题,让技术真正成为你的竞争力。 🚀

最新文章

随机文章