如有错误欢迎指正
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语言的指针有什么关系,我当时不知道,现在来看,创建对象就是创建指针并指向数据。