A016.浅拷贝和深拷贝
文章目录
问题: Python中浅拷贝和深拷贝的区别是什么?
👇 点击展开/折叠 面试背诵模板(建议先背这个)
核心区别图解
| 拷贝方式 | 操作对象 | 嵌套对象(子对象) | 修改嵌套对象是否影响原对象 |
|---|---|---|---|
赋值 (=) |
不复制,仅创建引用 | 完全共享 | ✅ 是 |
浅拷贝 (copy.copy()) |
创建新对象 | 共享引用 | ✅ 是 |
深拷贝 (copy.deepcopy()) |
创建新对象 | 递归创建新副本 | ❌ 否 |
代码示例
1 | import copy |
浅拷贝的三种实现方式
1 | import copy |
深拷贝的注意事项
- 必须使用
copy.deepcopy() - 递归对象(包含对自身引用的对象)可能导致递归循环,
deepcopy()通过维护memo字典避免该问题 - 可能复制过多:如应该在副本之间共享的管理数据也被复制
- 不可复制类型:模块、方法、文件、socket、栈帧等无法被深拷贝
性能与选型建议
| 维度 | 浅拷贝 | 深拷贝 |
|---|---|---|
| 速度 | 快 | 慢(递归复制所有层级) |
| 内存占用 | 低 | 高 |
| 适用场景 | 仅第一层需要独立 | 需要完全独立的副本 |
| 时间复杂度 | O(1)(仅复制引用) | O(n)(递归复制所有对象) |
可变对象与不可变对象的拷贝行为
- 不可变对象(如整数、字符串、元组):浅拷贝和深拷贝无实际差异,因为无法修改其值
- 可变对象(如列表、字典):浅拷贝时,嵌套的可变对象仍共享引用,修改会双向反映
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LGQ的博客!