Python中的深浅拷贝区别解析

举报
赵KK日常技术记录 发表于 2023/08/08 17:47:21 2023/08/08
【摘要】 1. 引言在 Python 编程中,我们经常需要对对象进行拷贝。拷贝可以分为浅拷贝和深拷贝。浅拷贝和深拷贝的区别在于:浅拷贝会创建对象的副本,而不拷贝对象内部的子对象;但深拷贝会拷贝所有的子对象,递归地拷贝到底。那么什么时候该用浅拷贝,什么时候该用深拷贝呢?本文将通过示例代码阐述 Python 中浅拷贝和深拷贝的区别,以及应用场景。 2. 浅拷贝在 Python 中,简单给一个变量赋值,实...

1. 引言

在 Python 编程中,我们经常需要对对象进行拷贝。拷贝可以分为浅拷贝和深拷贝。浅拷贝和深拷贝的区别在于:浅拷贝会创建对象的副本,而不拷贝对象内部的子对象;但深拷贝会拷贝所有的子对象,递归地拷贝到底。那么什么时候该用浅拷贝,什么时候该用深拷贝呢?本文将通过示例代码阐述 Python 中浅拷贝和深拷贝的区别,以及应用场景。

2. 浅拷贝

在 Python 中,简单给一个变量赋值,实际上是做对象的浅拷贝。也就是说,新旧变量共享内存中同一对象。

python

import copy

a = 1, 2, 3

b = a

print(a is b) # True, a和b指向同一对象

b.append(4)

print(a) # 1, 2, 3, 4, a也发生了变化

上面代码中,a 和 b 变量指向了同一个列表对象,所以修改 b 也会影响到 a。

除了直接赋值外,一些常见的浅拷贝方式还包括:

  • 切片操作:new_list = old_list:
  • dict() 函数:new_dict = dict(old_dict)
  • set() 函数:new_set = set(old_set)
    这些浅拷贝只会拷贝对象本身,而不会拷贝对象中的子对象。比如:
    python
    a = [1, 2, 3]
    b = list(a) # 浅拷贝
    b.append(4)
    print(a) # [1, 2, 3] 不受影响
    print(b) # [1, 2, 3, 4]

b0.append(4)

print(a) # [1, 2, 4, 3] 子对象互相影响

print(b) # [1, 2, 4, 3, 4]

3. 深拷贝

而深拷贝不同,它会新建对象,以及递归拷贝对象中的所有子对象。Python 中深拷贝可以使用 copy 模块的 deepcopy 函数实现。

python

import copy

a = [1, 2, 3]

b = copy.deepcopy(a)

b.append(4)

b0.append(4)

print(a) # [1, 2, 3] 不受影响

print(b) # [1, 2, 4, 3, 4]

从例子可以看出,深拷贝会完全拷贝对象本身和子对象,修改拷贝后对象不会影响到原对象。

4. 应用场景

  • 浅拷贝:当对象中的子对象可以共享,或者不需要拷贝子对象时,可以使用浅拷贝,比如切片操作、字典拷贝等。这种方式提高了执行效率。
  • 深拷贝:当需要修改拷贝对象时使用深拷贝,这可以防止对原对象的影响。比如需要重复使用的对象模板,每次使用前需要做深拷贝。
  • 直接赋值:如果两个变量需要共享对象,只需要简单赋值即可。5. 总结
  • Python 中通过直接赋值实现对象的浅拷贝。浅拷贝只拷贝对象本身,不会拷贝子对象。
  • 深拷贝通过 copy 模块的 deepcopy 实现,它会递归拷贝对象的子对象。
  • 浅拷贝适用于子对象可以共享的场景,可以提高执行效率;深拷贝适用于需要修改拷贝对象而不影响原对象的场景。
  • 直接赋值使两个变量共享一个对象。
  • 正确理解浅拷贝和深拷贝的区别,可以帮助我们编写更加安全高效的Python程序。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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