【编程小白必看】Python深拷贝和浅拷贝操作秘籍🔥一文全掌握
前言
嘿,小伙伴们!今天我们要聊聊 Python 中一个非常重要的概念——深拷贝和浅拷贝。这两个概念听起来可能有些抽象,但其实它们在日常编程中非常重要。跟着我一起,让我们揭开深拷贝和浅拷贝的神秘面纱吧!
一、什么是深拷贝和浅拷贝?
在 Python 中,当我们复制一个对象时,通常有两种方式:浅拷贝(shallow copy)和深拷贝(deep copy)。这两种方式的区别在于如何处理对象中的可变子对象。
1.浅拷贝:只复制对象的第一层,对于对象中的可变子对象,只是复制了它们的引用。
2.深拷贝:不仅复制对象的第一层,还会递归地复制所有子对象。
二、浅拷贝 vs 深拷贝
为了更好地理解浅拷贝和深拷贝的区别,我们先来看一些具体的例子。
1.浅拷贝
浅拷贝只复制对象的第一层,对于对象中的可变子对象,只是复制了它们的引用。
代码如下(示例):
import copy
# 创建一个列表
original_list = [[1, 2], [3, 4]]
# 浅拷贝
shallow_copy = copy.copy(original_list)
# 修改原始列表中的子列表
original_list[0].append(5)
# 输出原始列表和浅拷贝后的列表
print("Original List:", original_list) # 输出 [[1, 2, 5], [3, 4]]
print("Shallow Copy:", shallow_copy) # 输出 [[1, 2, 5], [3, 4]]
在这个例子中,虽然我们对 original_list 进行了修改,但是 shallow_copy 也发生了变化。这是因为浅拷贝只复制了第一层列表,
对于子列表 [1, 2] 和 [3, 4],只是复制了它们的引用。
2.深拷贝
深拷贝不仅复制对象的第一层,还会递归地复制所有子对象。
代码如下(示例):
import copy
# 创建一个列表
original_list = [[1, 2], [3, 4]]
# 深拷贝
deep_copy = copy.deepcopy(original_list)
# 修改原始列表中的子列表
original_list[0].append(5)
# 输出原始列表和深拷贝后的列表
print("Original List:", original_list) # 输出 [[1, 2, 5], [3, 4]]
print("Deep Copy:", deep_copy) # 输出 [[1, 2], [3, 4]]
在这个例子中,虽然我们对 original_list 进行了修改,但是 deep_copy 没有发生变化。这是因为深拷贝递归地复制了所有子对象。
三、深拷贝和浅拷贝的应用场景
深拷贝和浅拷贝在实际开发中有很多应用场景。下面是一些常见的例子。
1.字典的拷贝
字典也可以进行浅拷贝和深拷贝。
代码如下(示例):
import copy
# 创建一个字典
original_dict = {'key1': [1, 2], 'key2': [3, 4]}
# 浅拷贝
shallow_copy = copy.copy(original_dict)
# 深拷贝
deep_copy = copy.deepcopy(original_dict)
# 修改原始字典中的子列表
original_dict['key1'].append(5)
# 输出原始字典和拷贝后的字典
print("Original Dict:", original_dict) # 输出 {'key1': [1, 2, 5], 'key2': [3, 4]}
print("Shallow Copy:", shallow_copy) # 输出 {'key1': [1, 2, 5], 'key2': [3, 4]}
print("Deep Copy:", deep_copy) # 输出 {'key1': [1, 2], 'key2': [3, 4]}
在这个例子中,浅拷贝和深拷贝的效果与列表类似。
2.对象的拷贝
对于自定义的对象,也可以进行浅拷贝和深拷贝。
代码如下(示例):
import copy
class MyClass:
def __init__(self, data):
self.data = data
# 创建一个对象
original_obj = MyClass([1, 2])
# 浅拷贝
shallow_copy = copy.copy(original_obj)
# 深拷贝
deep_copy = copy.deepcopy(original_obj)
# 修改原始对象中的子列表
original_obj.data.append(3)
# 输出原始对象和拷贝后的对象
print("Original Obj Data:", original_obj.data) # 输出 [1, 2, 3]
print("Shallow Copy Data:", shallow_copy.data) # 输出 [1, 2, 3]
print("Deep Copy Data:", deep_copy.data) # 输出 [1, 2]
在这个例子中,浅拷贝和深拷贝的效果也与列表类似。
总结
通过上面的例子,我们可以看到浅拷贝和深拷贝的区别。浅拷贝只复制对象的第一层,对于对象中的可变子对象,只是复制了它们的引用;而深拷贝不仅复制对象的第一层,还会递归地复制所有子对象。选择哪种拷贝方式取决于具体的应用场景。
希望这篇博客能帮助你更好地理解和使用浅拷贝和深拷贝。如果还有任何疑问,欢迎留言讨论!