pythonimport copy
# 原始数据
original_list = [1, 2, [3, 4], {'a': 5}]
# 浅拷贝
shallow_copied = copy.copy(original_list)
# 或者使用列表的copy()方法
shallow_copied2 = original_list.copy()
# 或者使用切片
shallow_copied3 = original_list[:]
# 深拷贝
deep_copied = copy.deepcopy(original_list)
pythonimport copy
# 原始列表包含嵌套列表
original = [1, 2, [3, 4]]
# 浅拷贝
shallow = copy.copy(original)
# 深拷贝
deep = copy.deepcopy(original)
print("原始ID:", id(original), "嵌套列表ID:", id(original[2]))
print("浅拷贝ID:", id(shallow), "嵌套列表ID:", id(shallow[2]))
print("深拷贝ID:", id(deep), "嵌套列表ID:", id(deep[2]))
# 修改原始列表的嵌套元素
original[2][0] = 999
print("\n修改后:")
print("原始:", original) # [1, 2, [999, 4]]
print("浅拷贝:", shallow) # [1, 2, [999, 4]] - 被影响!
print("深拷贝:", deep) # [1, 2, [3, 4]] - 不受影响
输出结果:
原始ID: 140245120000000 嵌套列表ID: 140245120000016 浅拷贝ID: 140245120000032 嵌套列表ID: 140245120000016 深拷贝ID: 140245120000048 嵌套列表ID: 140245120000064 修改后: 原始: [1, 2, [999, 4]] 浅拷贝: [1, 2, [999, 4]] 深拷贝: [1, 2, [3, 4]]
pythonimport copy
# 对于不可变对象,浅拷贝和深拷贝效果相同
tup1 = (1, 2, 3)
tup2_copy = copy.copy(tup1)
tup2_deep = copy.deepcopy(tup1)
print(id(tup1) == id(tup2_copy)) # True - Python会优化,重用对象
print(id(tup1) == id(tup2_deep)) # True
pythonimport copy
# 字典的拷贝
dict_original = {'a': 1, 'b': [2, 3]}
dict_shallow = copy.copy(dict_original)
dict_deep = copy.deepcopy(dict_original)
dict_original['b'][0] = 999
print("原始:", dict_original) # {'a': 1, 'b': [999, 3]}
print("浅拷贝:", dict_shallow) # {'a': 1, 'b': [999, 3]} - 被影响
print("深拷贝:", dict_deep) # {'a': 1, 'b': [2, 3]} - 不受影响
浅拷贝适用场景:
深拷贝适用场景:
检查对象是否包含嵌套的可变对象(列表、字典、集合等),如果有且需要独立修改,则使用深拷贝。
pythonimport copy
import time
large_list = [[i for i in range(1000)] for _ in range(1000)]
# 浅拷贝性能测试
start = time.time()
shallow_copy = copy.copy(large_list)
print(f"浅拷贝时间: {time.time() - start:.4f}秒")
# 深拷贝性能测试
start = time.time()
deep_copy = copy.deepcopy(large_list)
print(f"深拷贝时间: {time.time() - start:.4f}秒")
| 特性 | 浅拷贝 | 深拷贝 |
|---|---|---|
| 复制层级 | 只复制顶层 | 递归复制所有层级 |
| 嵌套对象 | 共享引用 | 创建新对象 |
| 内存使用 | 较少 | 较多 |
| 性能 | 较快 | 较慢 |
| 独立性 | 嵌套对象不独立 | 完全独立 |
| 适用场景 | 无嵌套可变对象或需要共享 | 需要完全独立的副本 |
作为测试工程师,理解这些概念对于:


本文作者:李佳玮
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!