Python字典作为最常用的数据结构之一,拷贝是日常开发中高频操作,但很多新手容易踩坑:明明拷贝了字典,修改拷贝后的对象,原字典也跟着变了!
核心原因就是没分清:直接赋值、浅拷贝、深拷贝三者的区别。
今天用最通俗的语言+完整可运行代码,把字典拷贝讲得明明白白,新手也能一看就会!
一、先明确核心结论
| | | |
|---|
| dict2 = dict1 | | |
| copy() | | |
| 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种写法
代码示例(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
核心特点
✅ 顶层数据互不影响 ✅ 内层嵌套列表、子字典全部互不影响 ✅ 真正意义上的「独立克隆」
三、一张表看懂三者区别
四、开发最佳实践(必看)
- 简单单层字典:用
dict.copy() 浅拷贝,轻量高效 - 嵌套字典/列表:一律用
deepcopy() 深拷贝,避免隐形bug - 绝对不要用直接赋值当拷贝使用,90%的字典拷贝坑都源于此
五、极简记忆口诀
赋值不拷贝,共用一个坑 浅拷顶一层,嵌套还共用 深拷全递归,修改互不痛
总结
- 浅拷贝(copy):单层独立,嵌套共用,适合简单字典
- 深拷贝(deepcopy):全层级独立,适合嵌套字典,最安全