40、零基础Python到全栈-深浅拷贝之浅拷贝

2023-05-28 0 269

第一章他们来说厚薄复本的浅复本,

我先表述三个条目,l=[王英仙,徐凤年,[瞿景淳罡,邓因以]]。

40、零基础Python到全栈-深浅拷贝之浅拷贝

缓存里的内部结构是这种的,我早已提早画好图了。

40、零基础Python到全栈-深浅拷贝之浅拷贝

果不其然在对去里头提出申请条目的缓存空间,门牌号是001接着里头放的是检索相关联值的物理门牌号,0号检索相关联的物理门牌号是‘王英仙’那个值的物理门牌号。1号真实写照相关联的是‘徐凤年’的物理门牌号。四号检索相关联的又是三个条目的物理门牌号,接着字条目里头又存了三个原素,条目里头的0号检索对应‘瞿景淳罡’的物理门牌号,1号检索相关联‘邓因以’的物理门牌号。

那时我写三个l2=l1。

40、零基础Python到全栈-深浅拷贝之浅拷贝

虽然cp相关联的是物理门牌号,因此我这儿把l1表达式给l2就意味著把l1的缓存纸本给了l2。这是他们后面的段落讲过的,看完我后面所讲的如果是能认知的吧。

接着在缓存里是这种表明的。

40、零基础Python到全栈-深浅拷贝之浅拷贝

三个cp同时只想了同三个物理门牌号,也是l1和l2是无法分割开的,只要做了三个改动另外三个也会跟着改。

那时我把l1的0号检索改成‘张麻子’,这时候l2也会跟着改对吧,接着他们来打印一下l1和l2。结果就都变成了‘张坦克’。

40、零基础Python到全栈-深浅拷贝之浅拷贝

但是假如我那时有三个需求,我那时就想表述三个l2,他是l1的复本版本,但是我想把两者完全分割开,l2修改之后不能影响我l1原有的数据。于是给予有了厚薄复本的概念。

首先来看浅复本,我直接写三个l1.copy,将它表达式给l3。Pycharm也给他们提示了copy那个功能。

40、零基础Python到全栈-深浅拷贝之浅拷贝

那个是浅复本,接着他们再来打印一下l3看看,结果就是和l1一样的

40、零基础Python到全栈-深浅拷贝之浅拷贝

那时他们来打印下一下l1的id和l3的id,结果这三个id不一样。说明这是两块不同的物理门牌号对吧。但是它们连那个和的内容又是一样的。

40、零基础Python到全栈-深浅拷贝之浅拷贝

这时候他们就要来验证一下这三个条目装的内容。先来打印一下l1的0号检索的id,1号检索的id和2号检索的id。再打印下l3的0号检索的id,1号检索的id和2号检索的id。

40、零基础Python到全栈-深浅拷贝之浅拷贝

这三个条目的id不一样,但是它们里头存的数据的id确是一样的。说明了他们复本的那个条目只是复本了那个容器本身产生了三个新的容器,但是容器里头的数据还是原来的数据。

他们来看图,首果不其然l3指向了三个新的物理门牌号,接着里头存的物理门牌号和上面是一样的对吧,都指向了同样的物理门牌号。这种复本完了之后,他们发现最后只想到还是同样的物理门牌号,唯一变了的就只有条目那个容器本身的物理门牌号。

40、零基础Python到全栈-深浅拷贝之浅拷贝

他们来改一下l3的内容,还是把l3的第三个原素改成‘张坦克’,第二个原素改成‘徐晓’,第三个原素那个条目的第一个原素也改一下,改成‘剑九黄’,第二个原素改成‘王仙芝’。接着他们再来打印一下l1和l3。

40、零基础Python到全栈-深浅拷贝之浅拷贝

l3的所有内容确实被他们改掉了,但是l1只有它的字条目改变了,这是因为浅复本只会把原条目的第一层里头的检索和内存门牌号一模一样复本到三个新的缓存空间里头,虽然那个条目的第一和第二个原素是字符串,是不可变类型,因此当他们改l3的时候又会提出申请新的缓存空间用来存他们改的‘张坦克’和‘徐晓’。但是原条目纸箱的还是原来的物理门牌号,虽然条目是可变类型,当他们改字条目的时候,他的物理门牌号是不会变的

因此l1和l3里头存的海慧寺原来的子条目的物理门牌号,但是那个子条目的数据却被他们改掉了,因此就会出现打印的这种情况。只有子条目的数据被改了。

这就叫浅复本,它会把原条目的第一层检索和物理门牌号,完全复本一份给新条目,如果原条目存的全部都是不可变类型,浅复本就可以正常使用,新条目改动之后全都是产生新的值,根本不会影响到原条目。

但是原条目一旦包含了可变可类型,浅复本的新条目就没办法和原条目完全分开了,如果想要把新条目的所有内容,不管是可变类型还是不可变类型都完全区分开就要用到下一章讲的深复本了。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务