
Python 中理解深拷贝(deep copy)和浅拷贝(shallow copy)的区别对于处理复杂数据结构至关重要,它们在引用共享和内存占用上的差异会影响程序的稳定性与数据安全。本文将详细介绍这两种拷贝方式的概念、使用方法以及适用场景。
浅拷贝创建一个新对象,但仅复制外层容器,内部元素(子对象)仍然是原对象的引用。这意味着修改副本的内部可变对象会影响原对象。
深拷贝递归地复制所有子对象,生成完全独立的副本,修改任何层级都不会影响原对象。
1、列表的浅拷贝:
original_list = [1, 2, [3, 4]]
# 方法1
copied_list = original_list.copy()
# 方法2
copied_list = list(original_list)2、字典的浅拷贝:
original_dict = {'a': 1, 'b': [2, 3]}
copied_dict = original_dict.copy()3、使用copy模块:
import copy
original = [1, [2, 3]]
shallow_copy = copy.copy(original)import copy
# 创建包含可变子对象的列表
original = [10, 20, ['a', 'b']]
shallow = copy.copy(original)
# 修改外层元素
shallow[0] = 100
print("修改外层后:")
print("原对象:", original) # [10, 20, ['a', 'b']]
print("浅拷贝:", shallow) # [100, 20, ['a', 'b']]
# 修改内部可变对象
shallow[2].append('c')
print("\n修改内层后:")
print("原对象:", original) # [10, 20, ['a', 'b', 'c']]
print("浅拷贝:", shallow) # [100, 20, ['a', 'b', 'c']]
import copy
original = [1, [2, 3]]
deep_copy = copy.deepcopy(original)import copy
# 创建包含可变子对象的列表
original = [10, 20, ['a', 'b']]
deep = copy.deepcopy(original)
# 修改外层元素
deep[0] = 100
print("修改外层后:")
print("原对象:", original) # [10, 20, ['a', 'b']]
print("深拷贝:", deep) # [100, 20, ['a', 'b']]
# 修改内部可变对象
deep[2].append('c')
print("\n修改内层后:")
print("原对象:", original) # [10, 20, ['a', 'b']]
print("深拷贝:", deep) # [100, 20, ['a', 'b', 'c']]
操作方式 | 是否创建新对象 | 内部子对象是否独立 | 性能 | 常用场景 |
|---|---|---|---|---|
赋值(=) | 否 | 否 | 最快 | 变量别名、引用共享 |
浅拷贝 | 是 | 否 | 较快 | 只需复制外层容器 |
深拷贝 | 是 | 是 | 较慢 | 需要完全隔离、避免任何共享 |
1、使用浅拷贝的场景:
2、使用深拷贝的场景:
选择拷贝方式时应根据实际需求:
理解这两种拷贝方式的区别,能帮助开发者更好地控制数据共享与隔离,编写出更健壮的Python代码。
1)对于不可变对象(int、float、str、tuple等),浅拷贝和深拷贝效果相同。
2)深拷贝性能较低,内存占用更高。
3)copy.deepcopy会自动处理循环引用,防止无限递归。
4)自定义类可以实现 copy 和 deepcopy 方法来自定义拷贝行为。
“无他,惟手熟尔”!有需要就用起来。
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!