Python学习(一)-深浅拷贝

我们了解到很多语言都有深浅拷贝一说,之前我只是单纯的将引用当作浅拷贝,而把独立开辟空间将数值一一进行复制理解为深拷贝。这种想法在一定情况下是错误的,比如Python。

这里我们必须区分两种情况,其拷贝对象是可变对象还是不可变对象。

可变对象:

赋值:

如果是单纯的赋值,这只是一个简单的索引拷贝,即两个变量同时指向了一个内存空间,如下图:

如果改变b中的值,则a中的值也会发生变化,a和b同时引用一个内存而已。

浅拷贝:

浅拷贝则完全不同,它会独自开辟空间,并进行拷贝。但是对于内部的子结构则是单纯的进行引用赋值,如下接着改例子:

我们通过切片得到方式进行拷贝,当我们接着改变b的数值时,a却没有改变,说明a,b已经拥有各种独立的存储空间才不会有影响。但是当修改b的内部子结构时,a也发生了修改。这是怎么回事呢?

这就是所谓的浅拷贝,它“浅”在只拷贝第一层的数据,之后的数据只是通过引用进行指向,并不是深层次的复制,如下图:

我们可以简单的理解为 a,b在第一层的数据是完全独立的,但是之后的数据是共同指向同一片内存。

深拷贝:

理解完浅拷贝,深拷贝就好理解很多,就是a,b所有的数据都是相互独立,各自占内存的。

具体例子以后再加。

不可变对象:

不可变对象的copy有所不同,这里的不可变对象我们常指str、tuple和None这三个对象,以str对象为例:

同样是赋值,为什么b替换一个字母,a却不变呢?由于str是不可变对象,创建之后就会存在常量区内,起初是b和a共同引用常量区的“string”。但是当b调用replace时,b在常量区又存储了一个“xtring”,并指向它。所以此时a,b各自应用了不同的str。

补充问题:

如下图,abs()是一个内建函数,源于builtins包中,由于是动态类型,所以在图中abs可以改为int型。接着用builtins.abs接着对abs进行赋值,为什么修改了builtins.abs,abs却不变呢?

希望大家不要被搞混了 ,最前面说的赋值修改是两个变量指向同个内存,其中修改内存中的数据而不是内存本身。现在这种情况是直接修改了builtins.abs的引用,所以后面builtins.abs和abs引用的内容不同了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值