Python3 中有六个标准的数据类型:
1、Number(数字)
2、String(字符串)
3、List(列表)
4、Tuple(元组)
5、Set(集合)
6、Dictionary(字典)
Python3 的六个标准数据类型中:
不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
看了上面的分类你会很懵,是的,博主第一次接触也是懵的(内心:????,为什么数字类型和字符串类型是不可变的)
懵逼的我们理解的:
x = 1 print(x)#此处输出结果为1 x = 2 print(x)#此处输出结果为2
所以单纯的想法是:这不就变了吗???(还理直气壮)
于是我们打算去搜索关于Python可变类型和不可变类型,会看到这样的解释:
不可变数据类型: 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型。
可变数据类型 :当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型。
对于之前接触过其他编程语言的人看完后可能已经大概能理解了,心中茅塞顿开。但是对于真正的编程小白来说可能就更无法理解了(小白内心:????什么又是内存地址)
每一个数据都存放在计算机内存中,系统想调用该数据,就会自动找到存放该数据的内存,或者将新的数据写入到一块新的内存中保存。也就是说每一个数据都对应着它自己唯一的内存空间,例如虽然世界上有与你同名的人,但你们生活的家不在同一个地方,别人想找到你,可以通过你家庭地址找到你。
大概了解了内存地址与数据之间的关系后,我们进一步说明可变数据与不可变数据。按照前所述:可变数据类型 :当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型。
加上对于内存地址与数据关系的理解再来看这句话,我们以列表类型为例可以理解为:
list = ["爸爸","妈妈","张三"] # 一个家庭(在一个内存块新建一个列表数据类型,类型值为["爸爸","妈妈","张三"]) print("张三家的地址(内存地址)为:" , id(list)) # 查看他家的地址(内存地址)id(变量)函数用于查看该变量的内存地址 list[2] = "张五" # 他爸觉得他名字不好听,想改名字叫王五了 print("张五家的地址(内存地址)为:" , id(list)) # 继续查看他家的地址
得到结果如下:
会发现两个地址一样,也就是说名字(变量值)改变,家庭地址(内存地址)不变,这样的就叫做可变数据类型,你可以通俗理解叫值变地址不变类型(方便理解)
同样方法以元组类型为例来理解不可变数据类型
tuple = ("爸爸","妈妈","张三")# 一个家庭(在一个内存块新建一个元组数据类型,类型值为("爸爸","妈妈","张三")) print("张三家的地址(内存地址)为:", id(tuple)) # 查看他家的地址(内存地址)id(变量)函数用于查看该变量的内存地址 tuple[2] = "张五" # 他爸觉得他名字不好听,想改名字叫王五了 print("张五家的地址(内存地址)为:", id(tuple)) # 继续查看他家的地址
运行以上代码将会报错如图所示:
这里也很直观的说明了元组类型是不允许修改值的,即为不可变类型。
再从我们最初所想的那样来看看,大家对照上面的代码仔细看看哪里不同(上面的是修改的方式,以下是以赋值的方式)
x = 1 print("x = 1时的内存地址为:",id(x)) x = 2 print("x = 2时的内存地址为:",id(x)) list = ["爸爸","妈妈","张三"] print("张三家的地址(内存地址)为:" , id(list)) list = ["爸爸","妈妈","张五"] print("张五家的地址(内存地址)为:" , id(list)) tuple = ("爸爸","妈妈","张三") print("张三家的地址(内存地址)为:", id(tuple)) tuple = ("爸爸","妈妈","张五") print("张五家的地址(内存地址)为:", id(tuple))
运行后得到如下结果:
可以发现每次赋值后内存地址都变了,也就是说赋值的方式来修改变量其实是从内存中另外寻找或者另外新建了一块内存来存取值,来赋给相应的变量。
由上所有的结果,相信小白们的疑惑都已经得到相应的解答,最后在此总结,Python中的可变数据类型和不可变数据类型是相对于内存而言的:
可以修改值并且对应的内存地址不变,这就是可变数据类型
不可以修改值,要想改变值,必须重新找到一块内存存储新的值,再将其赋给原变量,也就是要想改变值,必须改变地址。这就是不可变数据类型。