在pyhton中我们学习的对象有数值对象、字符串对象、布尔对象、元组、列表、集合,在这些对象中,有的对象地址是不随其值的改变而改变,而有的对象则会随着变量值的改变而发生改变,因此,我们就可以把这些对象进行划分,分为可变对象和不可变对象。下面我们来详细看一下他们之间有什么本质区别:
不可变对象
不可变对象有:整数、浮点数、字符串、元组、布尔对象
那么可变到底是什么意思,我们以整数为例来说明
这里给变量a和b赋的值都是1,整数1他的地址是固定不变的,不管我们把它赋值给谁,它的地址是不会发生改变的,下面我们继续看:
这里我们给变量c分别赋值了两个不同的值,两次的地址发生了改变,因为整数1和整数2的地址是不同的,每一个整数对应的是一个固定的地址,当我们赋值给变量的值发生改变时,地址也会随之发生改变。
我们又分别对c执行了+2和1的操作,可以看到当执行+2操作时,他的地址发生了改变,而再执行1操作时,地址没有发生改变,这里相信大家可以自己总结出原因了吧,是因为,执行+2操作时,他的值发生了改变,变为2+2=4,所以地址发生变化,当再执行1操作时,他的地址没有发生变化,因为41=4,所以地址和+2的地址一样。
总结上面的内容我们可以知道,不可变数据类型就是指当变量值改变时,变量的地址也随之发生改变。
可变数据对象
可变数据类型有:字典、列表、集合
上面我们知道不可变数据类型是指每一个值都有一个固定的地址,那么可变数据类型是不是就是指每一个值都不止一个地址呢?下面我们一起来验证一下;
以列表对象为例:
可以看到我们定义变量x和y的值都是[1,2,3],但是他们的地址却是不同的,也就是同一个值对应的有多个地址,
我们对x和y分别进行了运算,再查看他们的地址,发现x和y的地址都没有发生变化,说明值的改变不会改变变量的地址。
所以我们可以的出结论:可变变量是指变量的地址不会随着值的变化发生改变,但是如果重新给他赋值的话,他的地址是会发生变化的。因为对于可变变量,一个值对应有多个地址。