在python中一切皆对象。当定义一个变量a=100时,a并不是对象,100才是对象,100是一个int类型的对象。
当定义a=100时,python解释器会在内存中划分一块位置来存100这个数值,这个内存有一个地址,这时变量a就指向了这个地址。
不可变类型:
不可变:是指在系统分配的这个内存地址块中,保存的是100,那这个地址对应的就是100,不能改变。除非这个地址被回收了,然后重新分配了其他的值。
不可变类型:数值类型(int、float、bool)、string(字符串)、tuple(元组)
举例:
大概画个图理解一下:
对于不可变类型来说:内存中这块地址对应的值是不能改变的,所以如果想要修改变量a的值,就只能让他重新指向一个新的地址,所以此时的id(a)就发生了改变。
可变类型:
可变类型指的是,此处内存地址里面的值是可以改变的。比如set(集合)、list(列表)、dict(字典)
对于a = [1,2],方便理解的话,可以这样理解:a是一个变量,[1,2]是一个列表,其内部是int类型对象1,2 可以认为首先有一块地址,这个地址是这个列表的地址,地址里面存放的内容,是1,和2 在内存中的地址。
列表 【 】可以看做是一个索引表,a通过这个索引表寻找内部数据在哪,索引表也需要一个地址空间存放,这个地址空间里面的值可以改变,表内存放的就是内部具体数据在内存中的地址。
这里的地址是都是一块地址的起始位置,当列表中追加元素时,直接在这块地址空间中追加新元素的地址。对于id(a)来说,始终是不变的。
修改列表元素的值
注意一点:
这时候并不是对变量a进行更改,这里其实是再次创建了一个列表[1,2,3],让变量a指向了这个新的列表。
所以这时候的地址是不一样的。
自己的理解:
这些列表,字典等可变类型,就像是对那些不可变类型套了一个壳一样,
最内部的数据终究是那些 数字啊,字符串这些不可变的。就好像是用这个壳维护这些内部的数据。
具体这些图到底对不对,是不是我想的这样,我也无法确定,目前还在学习阶段,只能暂时帮助理解一下。
参考:python可变对象与不可变对象