当前位置:首页>python>一文看懂Python字典拷贝:浅拷贝 vs 深拷贝(附详细案例)

一文看懂Python字典拷贝:浅拷贝 vs 深拷贝(附详细案例)

  • 2026-10-11 07:29:36
一文看懂Python字典拷贝:浅拷贝 vs 深拷贝(附详细案例)

Python字典作为最常用的数据结构之一,拷贝是日常开发中高频操作,但很多新手容易踩坑:明明拷贝了字典,修改拷贝后的对象,原字典也跟着变了!

核心原因就是没分清:直接赋值、浅拷贝、深拷贝三者的区别。

今天用最通俗的语言+完整可运行代码,把字典拷贝讲得明明白白,新手也能一看就会!

一、先明确核心结论

拷贝方式
语法
适用场景
核心特点
直接赋值
dict2 = dict1
无需独立副本,只想引用原字典
完全不拷贝,共用同一个对象
浅拷贝
copy()
/切片/dict()
字典只有一层数据,无嵌套
拷贝顶层对象,内层嵌套对象共用
深拷贝
deepcopy()
字典有嵌套(列表/子字典)
完全独立拷贝,所有层级互不影响

二、三种拷贝方式逐一对讲+实战案例

1. 直接赋值:不是拷贝,是「共用」

这是最基础的写法,本质没有创建新字典,只是给原字典起了一个「别名」。 两个变量指向内存中同一个字典对象,修改任意一个,另一个都会同步变化。

代码示例

# 原字典
person = {"name": "小明", "age": 20, "hobby": ["读书", "跑步"]}

# 直接赋值(不是拷贝!)
person_copy = person

# 修改拷贝后的字典
person_copy["age"] = 22
person_copy["hobby"].append("游泳")

# 打印结果
print("原字典:", person)
print("赋值字典:", person_copy)
print("两个字典是否是同一个对象:", person is person_copy)

输出结果

原字典: {'name': '小明', 'age': 22, 'hobby': ['读书', '跑步', '游泳']}
赋值字典: {'name': '小明', 'age': 22, 'hobby': ['读书', '跑步', '游泳']}
两个字典是否是同一个对象: True

总结

直接赋值绝对不是拷贝,只是引用传递,千万不要用它来做独立副本!


2. 浅拷贝(copy):只拷贝「第一层」

浅拷贝是Python官方推荐的一层独立拷贝方式,会创建一个新的顶层字典,但字典内部的嵌套对象(列表、子字典)依然共用。

适合:无嵌套的单层字典。

浅拷贝的3种写法

  1. 字典自带方法:dict.copy()
  2. 工厂函数:dict(dict1)
  3. 字典解包:{**dict1}

代码示例(copy() 最常用)

# 原字典(包含嵌套列表)
person = {"name": "小明", "age": 20, "hobby": ["读书", "跑步"]}

# 浅拷贝(创建新字典)
person_copy = person.copy()

# 1. 修改顶层数据(字符串、数字)
person_copy["age"] = 22

# 2. 修改内层嵌套数据(列表)
person_copy["hobby"].append("游泳")

# 打印结果
print("原字典:", person)
print("浅拷贝字典:", person_copy)
print("两个字典是否是同一个对象:", person is person_copy)

输出结果

原字典: {'name': '小明', 'age': 20, 'hobby': ['读书', '跑步', '游泳']}
浅拷贝字典: {'name': '小明', 'age': 22, 'hobby': ['读书', '跑步', '游泳']}
两个字典是否是同一个对象: False

关键解析

  • 顶层数据(age):修改拷贝对象,原字典不变(独立)
  • 内层数据(hobby列表):修改拷贝对象,原字典跟着变(共用)
  • 两个字典不是同一个对象,但嵌套对象共用内存

3. 深拷贝(deepcopy):完全独立的「克隆」

如果你的字典有嵌套结构(列表、子字典、元组里的可变对象),想要修改拷贝对象完全不影响原字典,必须用深拷贝。

深拷贝会递归拷贝所有层级的数据,创建一个100%独立的新对象,修改任何部分都互不干扰。

使用方法

需要导入Python内置模块 copy,调用 copy.deepcopy(字典)

代码示例

# 导入深拷贝函数
from copy import deepcopy

# 原字典(多层嵌套)
person = {
"name": "小明",
"age": 20,
"hobby": ["读书", "跑步"],
"info": {"height": 175, "weight": 65}
}

# 深拷贝(完全独立)
person_copy = deepcopy(person)

# 修改所有层级数据
person_copy["age"] = 22
person_copy["hobby"].append("游泳")
person_copy["info"]["height"] = 180

# 打印结果
print("原字典:", person)
print("深拷贝字典:", person_copy)
print("两个字典是否是同一个对象:", person is person_copy)

输出结果

原字典: {'name': '小明', 'age': 20, 'hobby': ['读书', '跑步'], 'info': {'height': 175, 'weight': 65}}
深拷贝字典: {'name': '小明', 'age': 22, 'hobby': ['读书', '跑步', '游泳'], 'info': {'height': 180, 'weight': 65}}
两个字典是否是同一个对象: False

核心特点

✅ 顶层数据互不影响 ✅ 内层嵌套列表、子字典全部互不影响 ✅ 真正意义上的「独立克隆」


三、一张表看懂三者区别

方式
是否创建新对象
顶层数据
嵌套数据
适用场景
直接赋值
❌ 否
同步变
同步变
无需独立副本
浅拷贝
✅ 是
互不影响
同步变
单层无嵌套字典
深拷贝
✅ 是
互不影响
互不影响
多层嵌套字典

四、开发最佳实践(必看)

  1. 简单单层字典:用 dict.copy() 浅拷贝,轻量高效
  2. 嵌套字典/列表:一律用 deepcopy() 深拷贝,避免隐形bug
  3. 绝对不要用直接赋值当拷贝使用,90%的字典拷贝坑都源于此

五、极简记忆口诀

赋值不拷贝,共用一个坑 浅拷顶一层,嵌套还共用 深拷全递归,修改互不痛


总结

  1. 直接赋值:无新对象,完全共用,禁止当拷贝用
  2. 浅拷贝(copy):单层独立,嵌套共用,适合简单字典
  3. 深拷贝(deepcopy):全层级独立,适合嵌套字典,最安全

最新文章

随机文章