浅copy和深copy

本文探讨了Python中的浅拷贝和深拷贝概念,解释了为什么修改一个对象的值会影响另一个。通过内存存储视角阐述了=操作符的工作原理,指出浅拷贝仅复制指针,导致两个对象共享同一内存区域。为避免这种影响,文章建议使用`copy.deepcopy()`进行深拷贝,确保对象独立。同时,也提及了C++中通过自定义构造函数实现类似深拷贝的功能。
摘要由CSDN通过智能技术生成

浅拷贝和深拷贝

Python中的:

引出思考的问题: 为什么下图中,修改a的值时候,b的值也会跟着一起修改?
在这里插入图片描述
Python中的各种数据类型(列表,元组等),实际上都是一个个对象,对象有方法(函数),属性(各种变量的值)

使用 = 这个符号的时候,操作是怎么进行的?

首先得知道,这些东西在内存中是如何存储的?

在这里插入图片描述
在这里插入图片描述
当a的指针指向了内存中的 1 区域,表示a这个变量是在内存中的 1 区域存储

执行 b = a 时候的操作:

在这里插入图片描述
只是将 b 的指针指向了和 a 的指针指向了的同一块区域,或者说将 a 的指针复制了一次,填充到了 b 中存放指针的那个区域

这就是浅拷贝 , 只是将指针进行了拷贝,指向了同一个内存区域,实际上没有将整个对象都复制,或者说创建一个新的对象,所以就会出现开头问题,修改 b 的值的时候,a 的值也会跟着一起修改,因为 a 和 b 指向的是同一个区域,所以,对 a 进行的操作会影响到 b ,对 b 进行的操作会影响到 a

在这里插入图片描述

如果我不想让这两个列表对象之间的修改相互影响到对方,要怎么操作呢?

将 a 对象完完整整的复制一次,而不是只将他的指针复制给 b 对象

像上述的这种操作,将 a 对象完完整整的复制一次给 b 对象,使得他们之间任何的操作之间不会产生相互的影响,完全变成相互独立的两个对象(浅拷贝的时候,两个对象之间的指针指向了同一块内存空间,仍然有一点联系),这就是深拷贝

怎么实现?(Python中)

使用 copy 模块里面的 deepcopy() 方法

在这里插入图片描述
在 Python 中,使用 copy 模块中的 deepcopy() 方法,可以将括号中的对象进行深拷贝,像上图中,深拷贝之后,a 和 b 之间的操作就相互独立,在 a 中添加的值,不会对 b 产生影响。

在 C++ 中如何实现类似的操作呢?

自定义构造函数,如果没有定义构造函数的话,编译器将默认生成一个默认构造函数,这个默认构造函数什么事情都不会做,相当于一个空白的函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值