深拷⻉和浅拷⻉有什么区别?

举报
wljslmz 发表于 2023/03/31 17:26:00 2023/03/31
【摘要】 深拷贝和浅拷贝是在 Python 中经常使用的两个概念。它们是对于对象拷贝而言的,两者之间有着重要的区别。在 Python 中,可以使用 copy 模块进行拷贝。在本文中,我们将讨论深拷贝和浅拷贝的区别以及它们的应用场景。 什么是浅拷贝浅拷贝是指创建一个新的对象,但是它只拷贝了原始对象的引用。这意味着新的对象和原始对象指向相同的内存地址,因此,当新的对象发生变化时,原始对象也会受到影响。下面...

深拷贝和浅拷贝是在 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}]

从输出结果中可以看到,修改原始对象的字典值后,浅拷贝对象和原始对象的字典值都被修改了,而深拷贝对象的字典值并没有被修改,说明深拷贝创建了一个新的对象,不会影响原始对象。

总结

总之,深拷贝和浅拷贝的区别在于是否共享内存地址,使用时需要根据具体需求选择合适的拷贝方式。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。