鱼C论坛

 找回密码
 立即注册
查看: 1448|回复: 4

[已解决]关于浅拷贝和深拷贝了解模糊了,有前辈指点一下吗

[复制链接]
发表于 2022-1-12 21:14:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
举个例子;
a=[1,2,3]
b=a
那么a和b的具体内容都是[1,2,3],且这个[1,2,3]的存储地址是一模一样的,如果对a进行修改的话,b也会发生改变
即a[1]=0
a=[1,0,3]
b=[1,0,3]

如果是深拷贝的话,我理解成a和b都是[1,2,3],但是a,b两者的存储地址是不同的,即:a发生改变,b不会改变。

当我回顾视频里的例子
x=[1,2,3]
y=x[:]
x[1]=1
x=[1,1,3]
y=[1,2,3]             我就开始纳闷了,这是怎么一回事





最佳答案
2022-1-12 21:16:33
第一个是别名 第二个是浅拷贝
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-12 21:16:33 | 显示全部楼层    本楼为最佳答案   
第一个是别名 第二个是浅拷贝
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-12 22:19:14 | 显示全部楼层
这不就是a改变b不改变吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-12 23:01:42 | 显示全部楼层
kogawananari 发表于 2022-1-12 21:16
第一个是别名 第二个是浅拷贝

如果是浅拷贝的话,x和y不是应该一样吗
就像:
    >>> x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    >>> y = x.copy()
    >>> x[1][1] = 0
    >>> x
    [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
    >>> y
    [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-13 11:02:34 | 显示全部楼层
第一个是赋值(复制),只是对对象的引用,就像是【1,2,3】贴了a,b两个标签一样,只要[1,2,3]变了,a,b就会变
第二个是浅拷贝(浅复制),只是复制了对象的外层结构,对内层依旧是引用,所以当你的列表里的列表的元素(这个就是内层结构)改变时,就会像复制一样都改变,而如果你改变的是列表里的元素就是x的【1,2,3】,【4,5,6】,【7,8,9】整体(外层结构),y就不会随着x的变化而变化,比如试一下
>>> x=[1,[1,2],3]
>>> y=x.copy()
>>> x[1]=[3,4]
你会发现结果变成了
>>> x
[1, [3, 4], 3]
>>> y
[1, [1, 2], 3]
另外,对于深拷贝(深复制),目前只有copy模块的deepcopy()函数,它是对对象从外层结构到内层结构都复制了,无论x怎么变,y都不会跟着变
总的来说,赋值是最不坚定的,只要你变了他就变了,浅拷贝则看中你的内在,你的外在怎么变不重要,当你的内在变了他才会跟着变,而深拷贝则是最坚定的,他不在意你,他只是他自己,不会随着任何人的改变而改变。
对于对象是否随着原对象的改变而改变,可以这么看,如果你还要深究他们的内部存储空间是否一致的话,那就还要分这个对象是可变的还是不可变的,详细的可以看下面的链接
Python中的赋值(复制)、浅拷贝与深拷贝 - 晚来天欲雪的文章 - 知乎 [url]https://zhuanlan.zhihu.com/p/54011712[/url]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-7 05:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表