Python16_可变与不可变类型

先记住:一切皆对象,一切皆对象的引用

 

python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址。
Python在heap中分配的对象分成两类:可变对象和不可变对象。
所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变。

 

 

Python函数参数对于可变对象,函数内对参数的改变会影响到原始对象;对于不可变对象,函数内对参数的改变不会影响到原始参数。原因在于:
1、可变对象,参数改变的是可变对象,其内容可以被修改。
2、不可变对象,改变的是函数内变量的指向对象。

============================================================

 

变量的本质:
a = 20
和其他编程语言一样的是,变量是内存地址的别名,即a代表了地址0x1002;
和其他编程语言不一样的是,Python中的变量和数据分开存储:变量a所代表的地址0x1001处仅保存了数据20存储的内存地址0x1002。
变量a所标示的内存空间存储数据20所在内存地址的过程称为引用。

 

 

一个对象可以被多个引用所指向。

 

当这个对象没有引用指向它时,这个对象所占用的内存,就要被“垃圾回收”了。

============================================================ 

类的实例化就是对象:类与对象的关系就如模具和铸件的关系,类的实例化的结果就是对象,而对对象的抽象就是类,类描述了一组有相同特性(属性)和相同行为的对象。

我的理解就是:对象是实实在在存在的东西,存在于内存中,需要占用内存空间的。而类则是模具一般,是对象的抽象,对象的定义。

对象是类的实例,类是灵魂的抽象的,对象是肉体的实例的。

当然理解内存,理解地址很关键!

============================================================  

不可变数据类型指的是引用的地址处的值不能改变。//不可变指的是指不可变

例如31106520地址处的值:1 ,被x引用了,x是不可变数据类型,所以这个地址处的值不能改变。直到它被回收为止。

不可变数据类型的优点就是内存中不管有多少个引用,相同的对象只占用了一块内存,

但是它的缺点就是当需要对变量进行运算从而改变变量引用的对象的值时,由于是不可变的数据类型,

所以必须创建新的对象,这样就会使得一次次的改变创建了一个个新的对象(效率会变低),不过不再使用的内存会被垃圾回收器回收。

 

可变数据类型指的是:值变化了,引用的地址不会变,但是地址处的值改变了,或是地址得到了扩充。

不会创建新的对象。这里的可变只是对于类似于append、+=等这种操作。

 

总之,用一句话来概括上述过程就是:“python中的不可变数据类型,不允许变量的值发生变化,

如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;

 

可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,

变量引用的对象的地址也不会变化,

不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,

相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。”

 

Python中:

不可变数据类型:int、float、string、tuple

可变数据类型:list、dict

===============================================================

相关链接:

这个链接讲得很好:https://blog.csdn.net/dan15188387481/article/details/49864613

 

posted @ 2020-02-04 22:03  Grooovvve  阅读(137)  评论(0编辑  收藏  举报