Tags: 数据类型 AI 人工智能

Python字典(Dictionary)复制的多种方法

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():处理嵌套可变对象时,使用深拷贝避免内部数据混淆。

了解并恰当地选择复制方式,可使你的字典数据安全地在不同变量或函数间传递,避免意外的引用冲突。