返回
浅尝辄止的认知浅析深拷贝与浅拷贝的区别
前端
2024-02-08 00:20:52
浅拷贝和深拷贝,如同镜面中的两个世界,两者只差了一个维度的距离,但各自所呈现的却完全不同。
在计算机科学中,浅拷贝与深拷贝是两个基本的数据复制技术。浅拷贝仅复制对象本身,而不复制其内部数据;深拷贝不仅复制对象本身,还递归复制其内部数据。
一、为什么要深拷贝?
浅拷贝和深拷贝之间最根本的区别在于,深拷贝复制对象的所有内容,而浅拷贝只复制对象本身。也就是说,当我们对浅拷贝的对象进行修改时,原始对象的内容也会受到影响;而对深拷贝的对象进行修改时,原始对象的内容则不会受到影响。
二、深拷贝 VS 浅拷贝
- 浅拷贝:
浅拷贝只复制对象本身,不复制其内部数据。- 深拷贝:
深拷贝不仅复制对象本身,还递归复制其内部数据。
三、最简单的深拷贝
最简单的深拷贝方法是使用 Python 的 copy
模块。这个模块提供了一个 deepcopy()
函数,可以实现深拷贝。
import copy
# 创建一个列表
my_list = [1, 2, 3]
# 使用 deepcopy() 函数复制列表
my_list_copy = copy.deepcopy(my_list)
# 修改复制后的列表
my_list_copy[0] = 4
# 打印原始列表和复制后的列表
print(my_list)
print(my_list_copy)
四、一行代码的深拷贝
如果要实现一行代码的深拷贝,可以使用 json
模块。这个模块提供了一个 dumps()
函数,可以将对象转换为 JSON 字符串,然后使用 loads()
函数将 JSON 字符串转换为对象。
import json
# 创建一个列表
my_list = [1, 2, 3]
# 使用 json.dumps() 函数将列表转换为 JSON 字符串
json_string = json.dumps(my_list)
# 使用 json.loads() 函数将 JSON 字符串转换为列表
my_list_copy = json.loads(json_string)
# 修改复制后的列表
my_list_copy[0] = 4
# 打印原始列表和复制后的列表
print(my_list)
print(my_list_copy)
五、递归爆栈
递归爆栈是递归过程中栈空间耗尽的一种情况。在递归过程中,每次函数调用都会在栈上创建一个新的栈帧。如果递归层数过多,就会导致栈空间耗尽,从而引发递归爆栈。
六、循环引用
循环引用是指两个或多个对象相互引用。当发生循环引用时,垃圾回收器无法回收这些对象,从而导致内存泄漏。
七、性能对比
深拷贝的性能要比浅拷贝慢。这是因为深拷贝需要递归复制对象的所有内容,而浅拷贝只需要复制对象本身。
八、参考
九、总结
浅拷贝和深拷贝是两种基本的数据复制技术。浅拷贝仅复制对象本身,而不复制其内部数据;深拷贝不仅复制对象本身,还递归复制其内部数据。在实际开发中,需要根据具体情况选择合适的拷贝方法。