如何复制字典并仅编辑副本

如何复制字典并仅编辑副本

技术背景

在Python中,赋值语句不会隐式复制对象。当你执行dict2 = dict1时,实际上是让dict2dict1引用同一个字典对象。因此,当你修改这个对象时,所有引用它的变量都会反映出对象的当前状态。如果需要复制字典,就必须显式地进行操作。

实现步骤

浅拷贝

浅拷贝只复制字典的顶层元素,对于字典中的嵌套对象,只是复制其引用。以下是几种实现浅拷贝的方法:

  • 使用dict()构造函数
1
2
dict1 = {"key1": "value1", "key2": "value2"}
dict2 = dict(dict1)
  • 使用copy()方法
1
2
dict1 = {"key1": "value1", "key2": "value2"}
dict2 = dict1.copy()
  • 使用解包操作符**(Python 3.5+)
1
2
dict1 = {"key1": "value1", "key2": "value2"}
dict2 = {**dict1}

深拷贝

深拷贝会递归地复制字典中的所有对象,包括嵌套对象。要实现深拷贝,可以使用copy模块的deepcopy()函数:

1
2
3
import copy
dict1 = {"key1": "value1", "key2": {"nested_key": "nested_value"}}
dict2 = copy.deepcopy(dict1)

核心代码

浅拷贝示例

1
2
3
4
5
dict1 = {"key1": "value1", "key2": "value2"}
dict2 = dict(dict1)
dict2["key2"] = "new_value"
print(dict1) # {'key1': 'value1', 'key2': 'value2'}
print(dict2) # {'key1': 'value1', 'key2': 'new_value'}

深拷贝示例

1
2
3
4
5
6
import copy
dict1 = {"key1": "value1", "key2": {"nested_key": "nested_value"}}
dict2 = copy.deepcopy(dict1)
dict2["key2"]["nested_key"] = "new_nested_value"
print(dict1) # {'key1': 'value1', 'key2': {'nested_key': 'nested_value'}}
print(dict2) # {'key1': 'value1', 'key2': {'nested_key': 'new_nested_value'}}

最佳实践

  • 浅拷贝:当字典中不包含嵌套的可变对象(如列表、字典等)时,使用浅拷贝即可。浅拷贝的速度较快,占用的内存也较少。
  • 深拷贝:当字典中包含嵌套的可变对象,且需要对副本进行修改而不影响原始字典时,使用深拷贝。

常见问题

浅拷贝无法复制嵌套对象

当使用浅拷贝复制包含嵌套对象的字典时,修改嵌套对象会同时影响原始字典和副本。例如:

1
2
3
4
5
dict1 = {"key1": "value1", "key2": {"nested_key": "nested_value"}}
dict2 = dict1.copy()
dict2["key2"]["nested_key"] = "new_nested_value"
print(dict1) # {'key1': 'value1', 'key2': {'nested_key': 'new_nested_value'}}
print(dict2) # {'key1': 'value1', 'key2': {'nested_key': 'new_nested_value'}}

解决方法是使用深拷贝:

1
2
3
4
5
6
import copy
dict1 = {"key1": "value1", "key2": {"nested_key": "nested_value"}}
dict2 = copy.deepcopy(dict1)
dict2["key2"]["nested_key"] = "new_nested_value"
print(dict1) # {'key1': 'value1', 'key2': {'nested_key': 'nested_value'}}
print(dict2) # {'key1': 'value1', 'key2': {'nested_key': 'new_nested_value'}}

深拷贝性能问题

深拷贝会递归地复制所有对象,因此在处理大型字典或嵌套层次较深的字典时,性能会受到影响,并且会占用较多的内存。如果可能,尽量使用浅拷贝或自定义拷贝方法。


如何复制字典并仅编辑副本
https://119291.xyz/posts/how-to-copy-a-dictionary-and-only-edit-the-copy/
作者
ww
发布于
2025年6月3日
许可协议