根据你提供的这份《平安银行 软件测试面试记录》,图中第14个问题是:
14. 了解浅拷贝和深拷贝
以下是这个问题的详细参考答案,适合在面试中回答:
核心区别(一句话版)
浅拷贝只复制对象本身,内部的子对象仍是原对象的引用;深拷贝会递归复制所有子对象,生成完全独立的新对象。
详细解释(Python 为例)
1. 浅拷贝 (Shallow Copy)
- 创建一个新对象,但新对象内部的元素是原对象中元素的引用
- 如果原对象中有可变对象(如列表、字典),修改这个可变对象会影响拷贝后的对象
python
import copy
original = [1, 2, [3, 4]]
shallow = copy.copy(original)
# 修改外层不可变元素(不影响原对象)
<NolebasePageProperties />
shallow[0] = 100
print(original[0]) # 1 (不变)
# 修改内层可变列表(会影响原对象)
shallow[2][0] = 999
print(original[2]) # [999, 4] (被改变了!)2. 深拷贝 (Deep Copy)
- 递归地复制对象及其所有子对象,生成完全独立的新对象
- 修改拷贝后的任何内容都不会影响原对象
python
import copy
original = [1, 2, [3, 4]]
deep = copy.deepcopy(original)
# 修改内层可变列表(不会影响原对象)
deep[2][0] = 999
print(original[2]) # [3, 4] (不变)
print(deep[2]) # [999, 4]对比表格
| 特性 | 浅拷贝 | 深拷贝 |
|---|---|---|
| 复制层级 | 只复制最外层 | 递归复制所有层级 |
| 内存占用 | 小 | 大 |
| 速度 | 快 | 慢 |
| 独立程度 | 子对象仍共享 | 完全独立 |
| 适用场景 | 对象结构简单、只包含不可变对象 | 需要完全独立副本、修改不应影响原对象 |
常见实现方式
浅拷贝:
copy.copy()- 列表切片
new_list = old_list[:] - 列表构造器
list(old_list)
深拷贝:
copy.deepcopy()
面试加分点(可选)
“在实际项目中,深拷贝需要注意循环引用问题,Python 的
deepcopy内部通过 memo 字典处理了这种情况。另外,深拷贝对性能有较大影响,如果对象层级很深或数据量很大,建议评估是否真的需要完全独立副本。”
总结回答模板
“浅拷贝只复制对象的第一层,内部的子对象还是共享引用;深拷贝则递归复制所有层级,生成完全独立的副本。Python 中可以用
copy模块的copy()和deepcopy()来实现。如果对象只包含不可变类型,浅拷贝就够用了;但如果包含嵌套的可变对象,并且希望修改不影响原对象,就需要用深拷贝。”
希望这个回答对你有帮助!面试时可以结合自己的项目经历举例说明,效果更好。