浅拷贝 & 深拷贝 & 赋值
在 Python 中,可以通过多种方式将一个字典复制给另一个变量。以下是几种常见的方法:
浅拷贝
浅拷贝只复制对象的引用,而不复制对象本身。因此,浅拷贝后的新对象中的引用仍然指向原对象所引用的对象。
使用 copy() 方法
这是最常用的方法之一,可以创建一个浅拷贝:
original_dict = {'a': 1, 'b': 2, 'c': 3}
copied_dict = original_dict.copy()
print(copied_dict) # 输出: {'a': 1, 'b': 2, 'c': 3}
使用 dict() 函数
dict() 函数也可以用于创建字典的浅拷贝:
original_dict = {'a': 1, 'b': 2, 'c': 3}
copied_dict = dict(original_dict)
print(copied_dict) # 输出: {'a': 1, 'b': 2, 'c': 3}
使用 copy 模块中的 copy 函数
使用 copy 模块中的 copy 函数也可以实现浅拷贝:
import copy
original_dict = {'a': 1, 'b': 2, 'c': 3}
copied_dict = copy.copy(original_dict)
print(copied_dict) # 输出: {'a': 1, 'b': 2, 'c': 3}
state.fds = new HashMap<String, FileDescriptor>(state.fds); 与直接赋值 state.fds = originalFds; 的作用不完全相同。它们之间有以下区别:
直接赋值
state.fds = originalFds;
直接赋值只是将 state.fds 引用指向 originalFds,它们共享同一个 HashMap 实例。因此,对 state.fds 或 originalFds 所做的任何修改都会相互影响,因为它们引用的是同一个对象。
浅拷贝
state.fds = new HashMap<String, FileDescriptor>(originalFds);
浅拷贝创建一个新的 HashMap 实例,并将 originalFds 中的所有键值对复制到新的 HashMap 中。这样,state.fds 和 originalFds 是两个独立的 HashMap 实例,但它们的键和值引用相同的对象。
深拷贝
深拷贝不仅复制对象本身,还递归地复制对象引用的所有对象。因此,深拷贝后的新对象与原对象在所有层次上都是独立的。
使用 copy 模块中的 deepcopy 函数
如果字典中包含嵌套的字典或其他可变对象,并且希望对这些对象也进行拷贝,可以使用 deepcopy 函数进行深拷贝:
import copy
original_dict = {'a': 1, 'b': {'x': 10, 'y': 20}, 'c': 3}
copied_dict = copy.deepcopy(original_dict)
print(copied_dict) # 输出: {'a': 1, 'b': {'x': 10, 'y': 20}, 'c': 3}
区别浅拷贝与深拷贝
浅拷贝只复制字典对象本身,但不复制其内部的可变对象,深拷贝则会递归地复制所有的内部对象:
import copy
original_dict = {'a': 1, 'b': {'x': 10, 'y': 20}, 'c': 3}
# 浅拷贝
shallow_copied_dict = original_dict.copy()
# 深拷贝
deep_copied_dict = copy.deepcopy(original_dict)
# 修改原始字典中的嵌套字典
original_dict['b']['x'] = 99
print(shallow_copied_dict) # 输出: {'a': 1, 'b': {'x': 99, 'y': 20}, 'c': 3}
print(deep_copied_dict) # 输出: {'a': 1, 'b': {'x': 10, 'y': 20}, 'c': 3}
如上所示,浅拷贝后的字典会受到原始字典修改的影响,而深拷贝后的字典则不会。

浙公网安备 33010602011771号