跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

Python 深浅拷贝详解

Python 深浅拷贝是处理复杂数据结构的关键概念。浅拷贝创建新对象但共享内部子对象引用,修改可变子对象会影响原对象;深拷贝递归复制所有子对象,确保完全独立。两者的定义、实现方式(如 copy 模块)、特点、示例代码及适用场景。通过对比分析,帮助开发者根据数据结构和性能需求选择合适的拷贝策略,避免副作用并优化内存管理。

技术博主发布于 2026/2/8更新于 2026/5/3023 浏览
Python 深浅拷贝详解

Python 深浅拷贝详解

在 Python 中,理解深拷贝(deep copy)和浅拷贝(shallow copy)对于处理复杂的数据结构,如列表、字典或自定义对象,是非常重要的。这两种拷贝方式决定了数据在内存中的复制方式,进而影响程序的运行结果。

浅拷贝

1. 定义

浅拷贝是一种复制操作,它创建一个新对象,并将原对象的内容复制到新对象中。对于原对象内部的子对象,浅拷贝不会递归地复制它们,而是直接引用这些子对象。因此,浅拷贝后的对象和原对象共享内部的子对象。

2. 实现方式

(1)使用 copy 模块的 copy() 函数
import copy
original_list = [1, 2, [3, 4]]
shallow_copied_list = copy.copy(original_list)
(2)使用列表、字典等数据结构的工厂函数
original_list = [1, 2, [3, 4]]
shallow_copied_list = list(original_list) # 列表的工厂函数
(3)使用切片操作(适用于列表)
original_list = [1, 2, [3, 4]]
shallow_copied_list = original_list[:] # 切片操作
(4)使用字典的 copy() 方法
original_dict = {'a': 1, 'b': [2, 3]}
shallow_copied_dict = original_dict.copy() # 字典的 copy() 方法

3. 特点

  • 新对象,旧引用:浅拷贝会创建一个新对象,但对象内部的子对象仍然是原对象中子对象的引用。
  • 共享子对象:如果原对象包含可变子对象(如列表、字典等),修改这些子对象会影响浅拷贝后的对象。
  • 性能较高:由于浅拷贝不会递归复制子对象,因此它的性能比深拷贝更高。

4. 示例

示例 1:修改浅拷贝后的对象
import copy
original_list = [1, 2, [3, 4]]
shallow_copied_list = copy.copy(original_list)
# 修改浅拷贝后的对象
shallow_copied_list[0] = 100
shallow_copied_list[2][0] = 300
print("Original List:", original_list)
print("Shallow Copied List:", shallow_copied_list)

输出:

Original List: [1, 2, [300, 4]]
Shallow Copied List: [100, 2, [300, 4]]

解释:

  • 修改 shallow_copied_list[0] 不会影响 original_list,因为这是对新对象本身的修改。
  • 修改 shallow_copied_list[2][0] 会影响 original_list,因为内部的子列表是共享的。

文章配图

示例 2:使用切片操作实现浅拷贝
original_list = [1, 2, [3, 4]]
shallow_copied_list = original_list[:]
# 修改浅拷贝后的对象
shallow_copied_list[0] = 100
shallow_copied_list[2][0] = 300
print("Original List:", original_list)
print("Shallow Copied List:", shallow_copied_list)

输出:

Original List: [1, 2, [300, 4]]
Shallow Copied List: [100, 2, [300, 4]]
示例 3:字典的浅拷贝
original_dict = {'a': 1, 'b': [2, 3]}
shallow_copied_dict = original_dict.copy()
# 修改浅拷贝后的字典
shallow_copied_dict['a'] = 100
shallow_copied_dict['b'][0] = 200
print("Original Dict:", original_dict)
print("Shallow Copied Dict:", shallow_copied_dict)

输出:

Original Dict: {'a': 1, 'b': [200, 3]}
Shallow Copied Dict: {'a': 100, 'b': [200, 3]}

解释:

  • 修改 shallow_copied_dict['a'] 不会影响 original_dict,因为这是对新对象本身的修改。
  • 修改 shallow_copied_dict['b'][0] 会影响 original_dict,因为内部的列表是共享的。

5. 适用场景

  • 对象内部没有嵌套的可变对象:如果对象内部只包含不可变对象(如整数、字符串、元组等),浅拷贝是安全的。
  • 性能要求较高:浅拷贝的性能比深拷贝更高,因为它不会递归复制子对象。
  • 共享子对象是期望的行为:如果你希望拷贝后的对象和原对象共享某些子对象,浅拷贝是一个合适的选择。

6. 注意事项

  • 共享子对象的风险:如果原对象包含可变子对象,修改这些子对象会影响浅拷贝后的对象。如果不希望共享子对象,应该使用深拷贝。
  • 不可变对象的特殊性:对于不可变对象(如整数、字符串、元组等),浅拷贝和深拷贝的行为是相同的,因为不可变对象不能被修改。

深拷贝

深拷贝(Deep Copy)是 Python 中一种递归复制对象的方式,它会创建一个新对象,并递归地复制原对象内部的所有子对象。这意味着深拷贝后的对象与原对象完全独立,修改其中一个不会影响另一个。深拷贝适用于需要完全独立副本的场景,尤其是当对象内部包含嵌套的可变对象时。

1. 定义

深拷贝是一种递归复制操作,它创建一个新对象,并递归地复制原对象内部的所有子对象。深拷贝后的对象与原对象完全独立,即使原对象包含嵌套的可变对象(如列表、字典等),修改其中一个对象也不会影响另一个。

2. 实现方式

在 Python 中,可以通过 copy 模块的 deepcopy() 函数实现深拷贝。

import copy
deep_copied_list = copy.deepcopy(original_list)

文章配图

3. 特点

  • 完全独立:深拷贝后的对象与原对象完全独立,修改其中一个不会影响另一个。
  • 递归复制:深拷贝会递归地复制对象内部的所有子对象,包括嵌套的可变对象。
  • 性能较低:由于深拷贝需要递归复制所有子对象,因此它的性能比浅拷贝低,尤其是在处理大型或复杂的嵌套结构时。

4. 示例

示例 1:修改深拷贝后的对象
import copy
original_list = [1, 2, [3, 4]]
deep_copied_list = copy.deepcopy(original_list)
# 修改深拷贝后的对象
deep_copied_list[0] = 100
deep_copied_list[2][0] = 300
print("Original List:", original_list)
print("Deep Copied List:", deep_copied_list)

输出:

Original List: [1, 2, [3, 4]]
Deep Copied List: [100, 2, [300, 4]]

解释:

  • 修改 deep_copied_list[0] 不会影响 original_list,因为这是对新对象本身的修改。
  • 修改 deep_copied_list[2][0] 也不会影响 original_list,因为深拷贝递归复制了内部的子列表,两个列表是完全独立的。

文章配图

示例 2:嵌套字典的深拷贝
import copy
original_dict = {'name': 'Alice', 'details': {'age': 25, 'hobbies': ['reading', 'traveling']}}
deep_copied_dict = copy.deepcopy(original_dict)
# 修改深拷贝后的字典
deep_copied_dict['details']['age'] = 30
deep_copied_dict['details']['hobbies'].append('cooking')
print("Original Dict:", original_dict)
print("Deep Copied Dict:", deep_copied_dict)

输出:

Original Dict: {'name': 'Alice', 'details': {'age': 25, 'hobbies': ['reading', 'traveling']}}
Deep Copied Dict: {'name': 'Alice', 'details': {'age': 30, 'hobbies': ['reading', 'traveling', 'cooking']}}

解释:

  • 修改 deep_copied_dict 中的嵌套字典和列表不会影响 original_dict,因为深拷贝递归复制了所有子对象。

文章配图

示例 3:自定义对象的深拷贝
import copy
class Player:
    def __init__(self, name, level):
        self.name = name
        self.level = level
        self.inventory = []
    def add_item(self, item):
        self.inventory.append(item)

player1 = Player("Alice", 10)
player1.add_item("Sword")
player1.add_item("Shield")
player2 = copy.deepcopy(player1)
player2.name = "Bob"
player2.add_item("Bow")

print(f"Player 1: {player1.name}, {player1.inventory}")
print(f"Player 2: {player2.name}, {player2.inventory}")

解释:

  • 需要完全独立的副本:当对象内部包含嵌套的可变对象时,深拷贝可以确保副本与原对象完全独立。
  • 复杂的数据结构:如嵌套的列表、字典、自定义对象等。
  • 循环引用问题:如果对象之间存在循环引用,深拷贝可能会导致栈溢出。Python 的 copy.deepcopy() 函数已经处理了循环引用问题,但在自定义深拷贝逻辑时需要注意。

文章配图

5. 实现原理

Python 的 copy.deepcopy() 函数通过递归遍历对象的所有属性来实现深拷贝。它会维护一个备忘录(memo)来记录已经复制的对象,从而避免循环引用导致的无限递归。

实际应用

1. 数据处理与修改

在处理数据时,尤其是嵌套的数据结构,你可能需要在不影响原始数据的情况下对数据进行修改或分析。这时,深拷贝非常有用。

import copy
original_data = {
    'name': 'Alice',
    'scores': [90, 85, 88],
    'details': {'age': 25, 'city': 'New York'}
}
copied_data = copy.deepcopy(original_data)
copied_data['scores'][0] = 95
copied_data['details']['city'] = 'San Francisco'
print("Original Data:", original_data)
print("Copied Data:", copied_data)

应用场景:

  • 数据备份与恢复。
  • 数据预处理(如修改数据后用于机器学习模型训练,而不影响原始数据)。

2. 配置管理

在程序中,配置通常以字典或嵌套字典的形式存储。如果你需要基于某个默认配置生成多个独立的配置,深拷贝可以确保每个配置之间互不干扰。

import copy
default_config = {
    'debug': False,
    'database': {
        'host': 'localhost',
        'port': 3306
    }
}
config_1 = copy.deepcopy(default_config)
config_2 = copy.deepcopy(default_config)
config_1['database']['host'] = '192.168.1.1'
config_2['debug'] = True
print("Config 1:", config_1)
print("Config 2:", config_2)

应用场景:

  • 多环境配置(开发、测试、生产)。
  • 动态生成多个独立的配置。

3. 对象复制与状态管理

在面向对象编程中,对象可能包含嵌套的对象或复杂的状态。如果你需要复制一个对象并确保新对象的状态独立于原对象,深拷贝是必要的。

应用场景:

  • 游戏开发中复制角色或物品。
  • 函数式编程中避免副作用。
  • 数据处理管道中确保数据独立性。
  • 状态快照与恢复(如撤销操作)。

4. 避免副作用

在函数中传递复杂对象时,深拷贝可以避免意外修改原对象。

def process_data(data):
    data_copy = copy.deepcopy(data)
    data_copy.append("Processed")
    return data_copy

original_data = [1, 2, 3]
result = process_data(original_data)
print("Original Data:", original_data)
print("Result:", result)

总结与建议

选择使用深拷贝还是浅拷贝取决于具体的需求和数据结构。如果你不确定,深拷贝通常是更安全的选择,尽管它可能会带来一些性能开销。

  • 深拷贝:适用于需要完全独立副本的场景,如数据处理、配置管理、对象复制等。
  • 浅拷贝:适用于性能敏感的场景,或者当对象内部没有嵌套结构时。

目录

  1. Python 深浅拷贝详解
  2. 浅拷贝
  3. 1. 定义
  4. 2. 实现方式
  5. (1)使用 copy 模块的 copy() 函数
  6. (2)使用列表、字典等数据结构的工厂函数
  7. (3)使用切片操作(适用于列表)
  8. (4)使用字典的 copy() 方法
  9. 3. 特点
  10. 4. 示例
  11. 示例 1:修改浅拷贝后的对象
  12. 修改浅拷贝后的对象
  13. 示例 2:使用切片操作实现浅拷贝
  14. 修改浅拷贝后的对象
  15. 示例 3:字典的浅拷贝
  16. 修改浅拷贝后的字典
  17. 5. 适用场景
  18. 6. 注意事项
  19. 深拷贝
  20. 1. 定义
  21. 2. 实现方式
  22. 3. 特点
  23. 4. 示例
  24. 示例 1:修改深拷贝后的对象
  25. 修改深拷贝后的对象
  26. 示例 2:嵌套字典的深拷贝
  27. 修改深拷贝后的字典
  28. 示例 3:自定义对象的深拷贝
  29. 5. 实现原理
  30. 实际应用
  31. 1. 数据处理与修改
  32. 2. 配置管理
  33. 3. 对象复制与状态管理
  34. 4. 避免副作用
  35. 总结与建议
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 6 款主流免费 AI 写作工具实测:网文创作避坑指南
  • DeepSeek-Coder vs Copilot:嵌入式开发场景适配性对比实战
  • 旧安卓手机变服务器:KSWEB 部署 Typecho 配合 cpolar 穿透
  • AionUi 开源运行时 UI 框架:让 AI 动态生成界面实战
  • OpenClaw 集成本地 llama.cpp 后端配置
  • 技术拆解:用 Web Audio API 实现音乐可视化动效
  • ROS2 机器人避障实战:从传感器融合到动态窗口法
  • IDEA 中清理未使用的 JDK 版本
  • 前后端分离与不分离架构对比分析
  • OpenClaw 本地优先 AI 智能体部署与使用指南
  • 树莓派Pico双语言开发对比:MicroPython原型与C/C++性能优化
  • AI 写作核心算法解析:从生成式模型到 Transformer
  • Linux 运维工程师必备的 17 个常用操作技巧
  • OpenClaw 本地推理方案:基于 Ollama 部署开源模型替代云端 Token 消耗
  • OpenNana 提示词图库:300+ AI 灵感资源与使用指南
  • pure-python-adb 纯 Python 实现的 Android 调试桥使用指南
  • Windows 本地部署 OpenClaw 对接飞书 AI 机器人指南
  • MCP Server 案例:Excel 表格一键生成可视化图表 HTML 报告
  • Web 应用架构与常见安全漏洞解析
  • 黑马点评商铺分页查询异常排查与修复

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online