python 深/浅拷贝及其区别
概述
1、什么是浅拷贝?
浅拷贝是指创建一个新的数据结构对象,该对象是原始数据结构的副本,但不复制原始数据结构中的嵌套对象的引用。浅拷贝可以通过各种方式完成,如切片、工厂函数或copy模块的copy方法。
2、什么是深拷贝?
深拷贝是指创建一个新的数据结构对象,该对象是原始数据结构及其所有嵌套对象的完整副本。深拷贝通常使用copy模块的deepcopy方法来完成。
3、区分浅拷贝和深拷贝
浅拷贝和深拷贝的区别在于它们是否复制了原始数据结构中的嵌套对象的引用。让我们通过示例代码来演示这一区别。
浅拷贝示例:
import copy
# 创建一个原始列表
original_list = [1, [2, 3], [4, 5], 9]
# 浅拷贝
shallow_copy = copy.copy(original_list)
shallow_copy_2 = copy.copy(original_list)
# 修改浅拷贝的元素
shallow_copy[1][0] = 6
# 修改浅拷贝2的元素
shallow_copy_2[-1] = 10
# 输出原始列表和浅拷贝
print("Original List:", original_list)
print("Shallow Copy:", shallow_copy)
print("Shallow Copy:", shallow_copy_2)
# 输出结果:
# Original List: [1, [6, 3], [4, 5], 9] # 可见原列表对象的 嵌套list 的数值跟着改变了,但非嵌套结构的值是不会改变的
# Shallow Copy: [1, [6, 3], [4, 5], 9] # 对嵌套列表内的值 做了更改
# Shallow Copy: [1, [6, 3], [4, 5], 10] # 对 非嵌套其他其结构 的值做了更改
结果显示出浅拷贝只复制了原始数据结构的引用,而不复制嵌套对象的引用。这意味着修改浅拷贝会影响原始数据结构。
深拷贝示例:
import copy
# 创建一个原始列表
original_list = [1, [2, 3], [4, 5], 9]
# 深拷贝
deep_copy = copy.deepcopy(original_list)
deep_copy_2 = copy.deepcopy(original_list)
# 修改深拷贝的元素
deep_copy[2][0] = 7
# 修改深拷贝2的元素
deep_copy_2[-1] = 8
# 输出原始列表和深拷贝
print("Original List:", original_list)
print("Deep Copy:", deep_copy)
print("Deep Copy:", deep_copy_2)
# 输出结果(深拷贝的修改对原对象不会进行改动):
# Original List: [1, [2, 3], [4, 5], 9]
# Deep Copy: [1, [2, 3], [7, 5], 9]
# Deep Copy: [1, [2, 3], [4, 5], 8]