python浅拷贝引发的c、Java变量名、变量和内存地址的思考

10 篇文章 1 订阅
9 篇文章 0 订阅

如有错误欢迎指正

        python的列表,用list.copy()的时候是浅拷贝,也就是没有创建新的对象而是拷贝了对象的引用,如果想深拷贝就得用copy.deepcopy().

        那么赋值语句是浅拷贝还是深拷贝?我们来试一下,

         赋值语句也是浅拷贝,那c语言或java语言是什么样的呢,因为面向对象,所以是浅拷贝吗?

还是说因为python语言没有定义数据类型?id函数所得到的是a或b的地址还是数据5的地址?

变量和数据之间到底是什么关系?

        我们先来看一篇文章介绍c语言变量名、变量和地址的问题

        c语言变量名、变量和地址的关系_vic_blackRabbit的博客-CSDN博客

         里面提到变量名并不占内存空间,变量名是给编译器看的,编译器根据变量是局部还是全局分配内存地址或栈空间,所谓的变量名在内存中不存在,操作时转换成地址数存放在寄存器中了。

        高级语言经过编译后,变量名变成了地址以机器码的形式存储了起来,a就消失了。 

        所以用id函数求a的地址,应该是求数据的地址,从编译器的表中查找。

        python中,两个变量a,b,用a给b赋值,输出a,b的地址,发现是一样的。我们现在试一下c语言的两个变量之间的赋值是怎么样的。

        我们发现,即使没有给啊设定一个初始值,将a赋值给b后,a,b都有自己的地址,这个结果说名,在定义一个变量的时候c语言就会根据数据类型创建一块内存空间。而python没有定义数据类型,python的赋值更像定义c语言中的字符串,是一个对象引用。

        还有一个问题,c和Java中,字符串不可修改,被当作对象引用,数字类型可以修改,没有被当作对象引用。在python中也有可修改数据类型和不可修改数据类型

         我们之前实验的数据是数字类型,它是一个不可修改类型,所以才是被当作对象引用吗?那我们来试一下可变数据类型list

         我们发现两个列表test和test5的id是一样的,所以可变数据类型,列表,也是被当作对象引用。

        c和Java是强类型语言,python弱类型语言。c和java在定义变量时会根据数据类型分配一定的空间,不管有没有数据。那python呢,我看到一篇文章,看完之后的总结是:在python中一切数据都是对象,在创建变量之初,会根据数据的类型分配不同大小的内存空间,比如a = 1,数字类型, 它占用28个字节。a ='x',字符串类型,它占用50个字节。详情请看这篇Python中对象的内存使用(一) - 知乎 (zhihu.com)

        说个题外话,有一次老师问我们Java的对象和c语言的指针有什么关系,我当时不知道,现在来看,创建对象就是创建指针并指向数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好人不心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值