深拷⻉和浅拷⻉有什么区别?
深拷贝和浅拷贝是在 Python 中经常使用的两个概念。它们是对于对象拷贝而言的,两者之间有着重要的区别。在 Python 中,可以使用 copy 模块进行拷贝。在本文中,我们将讨论深拷贝和浅拷贝的区别以及它们的应用场景。
什么是浅拷贝
浅拷贝是指创建一个新的对象,但是它只拷贝了原始对象的引用。这意味着新的对象和原始对象指向相同的内存地址,因此,当新的对象发生变化时,原始对象也会受到影响。
下面是一个浅拷贝的例子:
a = [1, 2, 3]
b = a.copy()
print(id(a))
print(id(b))
输出结果为:
Copy code
4354463112
4354462600
从输出结果可以看出,虽然 a 和 b 是不同的对象,但是它们的内存地址是相近的。这是因为 b 只是 a 的浅拷贝。
什么是深拷贝
深拷贝是指创建一个新的对象,同时它会递归地拷贝原始对象及其所有子对象。这意味着新的对象和原始对象是完全独立的,它们不会共享任何内存地址。
下面是一个深拷贝的例子:
import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a)
print(id(a))
print(id(b))
print(id(a[2]))
print(id(b[2]))
输出结果为:
Copy code
4375760136
4375760424
4375760712
4375760816
从输出结果可以看出,b 是完全独立的对象,并且它的内存地址与 a 完全不同。同时,它也递归地拷贝了 a 所有子对象的内存地址,因此 a[2] 和 b[2] 的内存地址也是不同的。
深拷贝和浅拷贝的区别在于对象被复制后,是否共享内存地址。
浅拷贝只是复制了原始对象的引用,也就是说新对象和原始对象引用的是同一个内存地址,当新对象修改了数据时,原始对象的数据也会被修改。而深拷贝则是在内存中创建一个新的对象,新的对象和原始对象引用的是不同的内存地址,因此修改新对象的数据不会影响到原始对象。
下面是使用 Python 代码演示深拷贝和浅拷贝的区别:
import copy
# 创建一个包含列表和字典的原始对象
original_object = [1, 2, {'a': 3, 'b': 4}]
# 浅拷贝
shallow_copy_object = copy.copy(original_object)
# 深拷贝
deep_copy_object = copy.deepcopy(original_object)
# 修改原始对象中的字典值
original_object[2]['a'] = 5
# 输出原始对象、浅拷贝和深拷贝后的对象
print(f"Original object: {original_object}")
print(f"Shallow copy object: {shallow_copy_object}")
print(f"Deep copy object: {deep_copy_object}")
执行上述代码,输出结果如下:
Original object: [1, 2, {'a': 5, 'b': 4}]
Shallow copy object: [1, 2, {'a': 5, 'b': 4}]
Deep copy object: [1, 2, {'a': 3, 'b': 4}]
从输出结果中可以看到,修改原始对象的字典值后,浅拷贝对象和原始对象的字典值都被修改了,而深拷贝对象的字典值并没有被修改,说明深拷贝创建了一个新的对象,不会影响原始对象。
总结
总之,深拷贝和浅拷贝的区别在于是否共享内存地址,使用时需要根据具体需求选择合适的拷贝方式。
- 点赞
- 收藏
- 关注作者
评论(0)