返回

浅尝辄止的认知浅析深拷贝与浅拷贝的区别

前端

浅拷贝和深拷贝,如同镜面中的两个世界,两者只差了一个维度的距离,但各自所呈现的却完全不同。

在计算机科学中,浅拷贝与深拷贝是两个基本的数据复制技术。浅拷贝仅复制对象本身,而不复制其内部数据;深拷贝不仅复制对象本身,还递归复制其内部数据。

一、为什么要深拷贝?

浅拷贝和深拷贝之间最根本的区别在于,深拷贝复制对象的所有内容,而浅拷贝只复制对象本身。也就是说,当我们对浅拷贝的对象进行修改时,原始对象的内容也会受到影响;而对深拷贝的对象进行修改时,原始对象的内容则不会受到影响。

二、深拷贝 VS 浅拷贝

  1. 浅拷贝:
    浅拷贝只复制对象本身,不复制其内部数据。
  2. 深拷贝:
    深拷贝不仅复制对象本身,还递归复制其内部数据。

三、最简单的深拷贝

最简单的深拷贝方法是使用 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)

五、递归爆栈

递归爆栈是递归过程中栈空间耗尽的一种情况。在递归过程中,每次函数调用都会在栈上创建一个新的栈帧。如果递归层数过多,就会导致栈空间耗尽,从而引发递归爆栈。

六、循环引用

循环引用是指两个或多个对象相互引用。当发生循环引用时,垃圾回收器无法回收这些对象,从而导致内存泄漏。

七、性能对比

深拷贝的性能要比浅拷贝慢。这是因为深拷贝需要递归复制对象的所有内容,而浅拷贝只需要复制对象本身。

八、参考

九、总结

浅拷贝和深拷贝是两种基本的数据复制技术。浅拷贝仅复制对象本身,而不复制其内部数据;深拷贝不仅复制对象本身,还递归复制其内部数据。在实际开发中,需要根据具体情况选择合适的拷贝方法。