Python中的变量以及赋值、浅拷贝与深拷贝

Python变量的实现方式

python中变量的实现方式是引用语义,什么意思呢,就是python中的变量对应的是内存地址;与之相对应的是 值语义,即变量对应的是真实值,例如C语言有一种更好的理解方式,把变量看成是一种代号,它的唯一作用就是方便开发者牢记和书写,这样的话引用语义中变量是内存地址的代表,值语义中变量是值的代表。


Python数据类型

既然python中的变量实现方式是引用语义,那么变量代表的内存空间中存储的是什么呢?内存空间中可以存两种类型的东西,一个是值,另一个是内存地址,其中存储值的变量对应的是不可变数据类型,存储内存地址的变量对应的是可变数据类型。如下图所示。

在这里插入图片描述
python中不可变数据类型boolean(有两个值TrueFalse)、intlongfloatstrtuple可变数据类型listdict


Python中赋值

对于不可变数据类型,不同的值会分配不同的内存空间,但是对于相同的值,系统只会分配一个内存空间,他们共用同一个内存空间;对于可变数据类型,不管值是否相同,会为每个值分别分配内存空间。如下图所示。
在这里插入图片描述

由于整数1是不可变数据类型,因此a和b代表的是同一个内存地址,而[1,2,3]是可变数据类型,因此c和d代表的是不同的内存地址。


Python中=、浅拷贝和深拷贝

python中的=,做的仅仅是为同一个内存地址贴上更多的代号,即将新的变量指向该内存地址。如下图。
在这里插入图片描述
不管是可变数据类型还是不可变数据类型,=操作仅仅将新的变量指向原来的内存地址,这样的话同一个内存地址便有多个变量指向它,也就有多个代号了,因为这两个变量除了名字之外其他都一模一样,相当于拷贝了0层。

对于浅拷贝深拷贝的区别,浅拷贝仅仅将变量对应的内存地址复制了一份,生成了一个新的内存地址,该内存地址中存储的其他地址不变,相当于拷贝了1层;而深拷贝除了将变量对应的内存地址复制了,它还将该内存地址中存储的可变数据类型的内存地址复制生成了新的内存地,此时相当于拷贝且仅拷贝了2层。举个例子:
在这里插入图片描述

对于变量对应的内存空间中存储的只有不可变值时,深浅拷贝的结果是一样的,它们分别得到了新的内存空间。

在这里插入图片描述
但是对于变量对应的内存空间中存储的有可变值时,深浅拷贝的结果是不一样的,由于浅拷贝并没有复制一份新的[1,2,3]对应的地址,所以变量aa_shallow[1,2,3]共用同一个内存地址,修改其中的值aa_shallow的值都会变,但是由于深拷贝将[1,2,3]的地址也复制了一份新的,所以它的值并不会受影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值