首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python 深拷贝与浅拷贝

Python 深拷贝与浅拷贝

作者头像
用户11081884
发布2026-07-20 17:16:57
发布2026-07-20 17:16:57
440
举报

Python 中理解深拷贝(deep copy)和浅拷贝(shallow copy)的区别对于处理复杂数据结构至关重要,它们在引用共享和内存占用上的差异会影响程序的稳定性与数据安全。本文将详细介绍这两种拷贝方式的概念、使用方法以及适用场景。

浅拷贝创建一个新对象,但仅复制外层容器,内部元素(子对象)仍然是原对象的引用。这意味着修改副本的内部可变对象会影响原对象。

深拷贝递归地复制所有子对象,生成完全独立的副本,修改任何层级都不会影响原对象。

常用方法

1、列表的浅拷贝:

代码语言:javascript
复制
original_list = [1, 2, [3, 4]]
# 方法1
copied_list = original_list.copy()
# 方法2
copied_list = list(original_list)

2、字典的浅拷贝:

代码语言:javascript
复制
original_dict = {'a': 1, 'b': [2, 3]}
copied_dict = original_dict.copy()

3、使用copy模块:

代码语言:javascript
复制
import copy
original = [1, [2, 3]]
shallow_copy = copy.copy(original)

示例代码

代码语言:javascript
复制
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']]

4、深拷贝的使用

代码语言:javascript
复制
import copy
original = [1, [2, 3]]
deep_copy = copy.deepcopy(original)

示例代码

代码语言:javascript
复制
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、使用浅拷贝的场景

  • 只需要复制外层容器结构。
  • 内部数据共享无妨。
  • 数据全为不可变对象(int、str、tuple等)

2、使用深拷贝的场景

  • 需要完全独立的副本。
  • 避免任何层级被修改。
  • 处理包含多层嵌套可变对象的数据结构。

选择拷贝方式时应根据实际需求:

  • 需要完全隔离数据时使用深拷贝。
  • 其他情况优先使用浅拷贝以提高性能。
  • 对于简单不可变对象,两者效果相同,可任意选择。

理解这两种拷贝方式的区别,能帮助开发者更好地控制数据共享与隔离,编写出更健壮的Python代码。

1)对于不可变对象(int、float、str、tuple等),浅拷贝和深拷贝效果相同。

2)深拷贝性能较低,内存占用更高。

3)copy.deepcopy会自动处理循环引用,防止无限递归。

4)自定义类可以实现 copydeepcopy 方法来自定义拷贝行为。

“无他,惟手熟尔”!有需要就用起来。

如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Nicholas与Pypi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常用方法
  • 示例代码
  • 4、深拷贝的使用
    • 示例代码
  • 三种方式的对比
  • 应用场景
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档