首页 > 技术文章 > 可变数据类型和不可变数据类型

kayvenguo 2019-02-14 15:50 原文

python中哪些是可变数据类型,哪些是不可变数据类型。可变数据类型:列表list和字典dict;不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。

 

我们可以使用:id()的方式进行查看(id()用来指出数据的内存地址)

 

不可变数据类型

例如:1  这个int类型的对象,我们通过输出得到

那么,1 的内存地址为1663593952

 此时我们定义一个变量,将1 作为对象赋值给它

如图,变量a的引用了对象1的地址,此时a的内存地址也是1663593952

我们再进定义一个变量

此时,变量b也引用了对象1的地址,也就是说,所有引用对象1的变量,它们的内存地址都是1663593952。

那如果我们将变量引用的对象改为2呢,很明显,它们的内存地址都会变成 2的内存地址,如下图演示

a,b,c,d这些变量,只要是在引用同一个对象,那么它们的内存地址就都是这个对象的内存地址,内存地址是不变的,只会记录有多少引用(也就是说图中1663593984这个内存地址有4个引用,分别是a,b,c,d),而只有当它们引用其他对象 2 后,它们的内存地址才会指向新的内存地址(新对象的内存地址)那么此时 1的内存地址会被垃圾器回收。无论有多少个变量引用一个对象,内存地址都不会发生改变,只有在重新赋值后内存地址才会发生改变。

 所以说不可变数据类型的优点就是内存中不管有多少个引用,相同的对象只占用了一块内存,但是它的缺点就是当需要对变量进行运算从而改变变量引用的对象的值时,由于是不可变的数据类型,所以必须创建新的对象,这样就会使得一次次的改变创建了一个个新的对象,不过不再使用的内存会被垃圾回收器回收。

 

我们再来看下可变数据类型:list

我们设定一个变量a,我们通过给a赋一样的值,来查看它的内存地址,如图:

从图中我们可以看到,我先给a这个变量赋值了一个list,即a = [1,2,3,4,5,6]  ,此时id(a) 得到的内存地址为1777391273992,也就是说对象[1,2,3,4,5,6]此时的内存地址为1777391273992。

那么我们再给a赋值一个list,还是[1,2,3,4,5,6],此时对象[1,2,3,4,5,6]的内存地址发生了改变1777391169608,其实第一次赋值和第二次赋值的[1,2,3,4,5,6],[1,2,3,4,5,6]它们不是同一个对象,它们只是值相同的两个list,也就是说,我们是在给a创建了两个值一样的不同对象。如图中所示,我们又对对象[1,2,3,4,5,6]进行了appeen等操作,也就是说对象[1,2,3,4,5,6]无论是变成了[1,2,3,4,5,6,7]还是变成了[1,2,3,4,5,6,7,2]。它都是原来的那个list,它的内存地址没有发生改变,只是它的值发生了改变。

其实我们区分数据类型是可变还是不可变的,主要从区分开什么是变量值的变化,什么是变量引用的对象地址的变化这些概念,在多做一些实际操作就一目了然了。

 

此处记录本人个人理解,本人也是从其他大神处学习并进行了实际操作得来的,可能说的不是很清晰,但只是作为个人理解的笔记。欢迎大神们指正错误,定认真阅读参考!!

推荐阅读