本文将从以下几个方面对Python中深拷贝和浅拷贝的区别做详细的阐述,包括:拷贝的含义、变量和对象的区别、浅拷贝的示例、深拷贝的示例、可变对象和不可变对象的区别、嵌套的数据结构以及深浅拷贝应用案例等。
一、拷贝的含义
拷贝是指将一个对象的值复制到另一个对象中,使得这个新对象有一个独立的存在方式。在Python中,拷贝操作是使用“=”符号或者copy()函数实现的。
二、变量和对象的区别
变量是指标识符,存储的是对象的引用,而对象是指具有数据类型的实体。
在Python中,对象可以分为可变对象和不可变对象,可变对象是指可以修改的对象,比如list和dict等,而不可变对象是指不能修改的对象,比如int、float、tuple等。
三、浅拷贝的示例
import copy
a = [1, 2, [3, 4]]
b = copy.copy(a)
print(a) # [1, 2, [3, 4]]
print(b) # [1, 2, [3, 4]]
a[2].append(5)
print(a) # [1, 2, [3, 4, 5]]
print(b) # [1, 2, [3, 4, 5]]
上述代码中,a是一个列表,其中还嵌套了一个列表[3, 4]。使用copy.copy()方法将a进行浅拷贝,得到了b。如果修改a的嵌套列表,可以发现b也会被修改,这是因为浅拷贝只拷贝了最外层的值,而对于嵌套的列表和字典等可变对象,只是拷贝了引用,没有创建新的对象。
四、深拷贝的示例
import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a)
print(a) # [1, 2, [3, 4]]
print(b) # [1, 2, [3, 4]]
a[2].append(5)
print(a) # [1, 2, [3, 4, 5]]
print(b) # [1, 2, [3, 4]]
上述代码使用copy.deepcopy()方法进行深拷贝,不仅仅拷贝了最外层的值,而且对于嵌套的列表和字典等可变对象,也创建了新的对象。因此,修改a的嵌套列表不会影响b。
五、可变对象和不可变对象的区别
在Python中,可变对象是指可以修改的对象,比如list和dict等,而不可变对象是指不能修改的对象,比如int、float、tuple等。拷贝可变对象时,浅拷贝只是拷贝了对象的引用,而深拷贝会创建新的对象。拷贝不可变对象时,无论是浅拷贝还是深拷贝,都会生成新的对象。
六、嵌套的数据结构
import copy
a = [1, 2, [3, 4, [5, 6]]]
b = copy.deepcopy(a)
print(a) # [1, 2, [3, 4, [5, 6]]]
print(b) # [1, 2, [3, 4, [5, 6]]]
a[2][2].append(7)
print(a) # [1, 2, [3, 4, [5, 6, 7]]]
print(b) # [1, 2, [3, 4, [5, 6]]]
上述代码中,a是一个嵌套的列表,其中还包含嵌套列表。使用copy.deepcopy()方法进行深拷贝时,会递归地创建新的对象。因此,修改a的嵌套列表中的数据,不会影响到b。
七、深浅拷贝应用案例
深浅拷贝在Python的开发中非常常见。其中,浅拷贝可以用于共享数据,创建副本等;深拷贝则常用于数据备份、数据传输、数据恢复等。
下面是一个深浅拷贝应用案例:
import copy
original = {
'name': 'Tom',
'age': 18,
'education': {
'degree': 'bachelor',
'major': 'Engineering'
},
'interests': ['music', 'sports']
}
# 浅拷贝
new_dict1 = copy.copy(original)
original['education']['major'] = 'Computer Science'
print(new_dict1) # {'name': 'Tom', 'age': 18, 'education': {'degree': 'bachelor', 'major': 'Computer Science'}, 'interests': ['music', 'sports']}
# 深拷贝
new_dict2 = copy.deepcopy(original)
original['education']['major'] = 'Math'
print(new_dict2) # {'name': 'Tom', 'age': 18, 'education': {'degree': 'bachelor', 'major': 'Computer Science'}, 'interests': ['music', 'sports']}
上述代码中,original是一个包含嵌套字典和列表的数据结构。使用浅拷贝将original拷贝到new_dict1中,修改original中嵌套字典的值,可以看到new_dict1也被修改了,这是由于修改了引用地址的缘故。而使用深拷贝将original拷贝到new_dict2中,修改original中嵌套字典的值,并不会影响new_dict2。
原创文章,作者:CQQZH,如若转载,请注明出处:https://www.506064.com/n/374637.html