在Python中,字典(Dictionary)是一种可变的数据结构。当我们仅使用dict2 = dict1
时,实际上只是让两个变量指向同一个字典对象;任何修改都会相互影响。本文将介绍如何正确复制字典,主要包括copy()
方法与dict()
构造函数。
1. 直接赋值导致的引用问题
若你使用dict2 = dict1
,那么两个变量指向同一字典对象:
dict1 = {"pinpai": "Fute", "nianfen": 1964}
dict2 = dict1
dict2["pinpai"] = "Fude"
print(dict1)
# 输出: {'pinpai': 'Fude', 'nianfen': 1964}
# dict1和dict2都被修改
这种情况称为引用赋值;要真正复制需要使用下面介绍的方法。
2. 使用copy()方法复制字典
copy()
方法会返回一个新字典对象,该对象与原字典在内容上相同,但不再共享同一引用:
dict1 = {
"pinpai": "Fute",
"xinghao": "Mustang",
"nianfen": 1964
}
dict2 = dict1.copy()
dict2["nianfen"] = 2020
print("dict1:", dict1)
print("dict2:", dict2)
# 输出示例:
# dict1: {'pinpai': 'Fute', 'xinghao': 'Mustang', 'nianfen': 1964}
# dict2: {'pinpai': 'Fute', 'xinghao': 'Mustang', 'nianfen': 2020}
可以看到修改dict2
的内容后,dict1
并没有跟着改变。
3. 使用dict()构造函数复制字典
另一种常用方式是使用dict()
方法:
dict1 = {
"pinpai": "Fute",
"xinghao": "Mustang",
"nianfen": 1964
}
dict2 = dict(dict1)
dict2["nianfen"] = 2020
print("dict1:", dict1)
print("dict2:", dict2)
# 输出示例:
# dict1: {'pinpai': 'Fute', 'xinghao': 'Mustang', 'nianfen': 1964}
# dict2: {'pinpai': 'Fute', 'xinghao': 'Mustang', 'nianfen': 2020}
dict()
与copy()
的效果基本一致,都是浅拷贝。
4. 浅拷贝与深拷贝的区别
上述copy()
和dict()
都是浅拷贝。如果你的字典中包含可变对象(如列表、字典等)嵌套时,内部可变对象依然引用同一对象。若需要完全拷贝嵌套结构,可使用copy.deepcopy()
。
import copy
dict1 = {"pinpai": "Fute", "peizhi": {"yanse": ["hongse", "baise"]}}
dict2 = copy.deepcopy(dict1)
dict2["peizhi"]["yanse"].append("lanse")
print("dict1:", dict1)
print("dict2:", dict2)
# dict1的"peizhi"未受影响
总结
- dict2 = dict1:引用同一对象,修改任何一方都会影响对方。
- thisdict.copy() / dict(thisdict):返回一个浅拷贝的新字典,常用场景即可满足。
- copy.deepcopy():处理嵌套可变对象时,使用深拷贝避免内部数据混淆。
了解并恰当地选择复制方式,可使你的字典数据安全地在不同变量或函数间传递,避免意外的引用冲突。