一、什么可变数据类型和不可变数据类型
可变数据类型:value值改变,id值不变;不可变数据类型:value值改变,id值也随之改变。
二、如何确定一种数据类型是可变的还是不可变的
根据可变数据类型与不可变数据类型的概念,只需要在改变value值的同时,使用id()函数查看变量id值是否变化就可以知道这种数据类型是可变的还是不可变的了。
先来看一段程序:
上面这段程序都是对不可变数据类型和可变数据类型的操作,id()查看的是当前变量的地址值。用一句话来概括上述过程就是:python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象;这句话好像有点长
那么什么称之为不可变数据类型呢?这里的不可变大家可以理解为x引用的地址处的值是不能被改变的,也就是值在没被垃圾回收之前一直都是1,不能改变,如果要把x赋值为2,那么只能将x引用的地址改变,相当于x = 2这个赋值又创建了一个对象,即2这个对象。
从上面的过程可以看出,不可变数据类型的优点就是内存中不管有多少个引用,相同的对象只占用了一块内存,但是它的缺点就是当需要对变量进行运算从而改变变量引用的对象的值时,由于是不可变的数据类型,所以必须创建新的对象,这样就会使得一次次的改变创建了一个个新的对象,不过不再使用的内存会被垃圾回收器回收。
从上面的过程可以看出,可变数据类型是允许同一对象的内容,即值可以变化,但是地址是不会变化的。但是需要注意一点,对可变数据类型的操作不能是直接进行新的赋值操作,比如说a = [1, 2, 3, 4, 5, 6, 7],这样的操作就不是改变值了,而是新建了一个新的对象,这里的可变只是对于类似于append、+=等这种操作。
总结
是否为可变类型在于内存单元的值是否可以被改变。如果是内存单元的搜索值不可改变的,在对对象本身操作的时候,必须在内存的另外地方再申请一块内存单元(因为老的内存单元不可变),老的内存单元就丢弃了(如果还有其他ref,则ref数字减1,类似unix下的hard-link);如果是可变的,对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请(+/-)即可,也就是它的地址会保持不变,但区域会变长或者变短。
领取专属 10元无门槛券
私享最新 技术干货