浅拷贝 & 深拷贝 & 赋值

在 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.fdsoriginalFds 所做的任何修改都会相互影响,因为它们引用的是同一个对象。

浅拷贝

state.fds = new HashMap<String, FileDescriptor>(originalFds);

浅拷贝创建一个新的 HashMap 实例,并将 originalFds 中的所有键值对复制到新的 HashMap 中。这样,state.fdsoriginalFds 是两个独立的 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}

如上所示,浅拷贝后的字典会受到原始字典修改的影响,而深拷贝后的字典则不会。

posted @ 2024-05-17 12:08  zzl14  阅读(45)  评论(0)    收藏  举报