Python中可变数据类型和不可变数据类型
⼀、可变数据类型和不可变数据类型
可变和不可变都是基于内存地址来说的。
不可变数据类型:当该数据类型的对应变量的值发⽣了改变,那么它对应的内存地址也会发⽣改变,对于这种数据类型,就称不可变数据类型。
可变数据类型:当该数据类型的对应变量的值发⽣了改变,那么它对应的内存地址不发⽣改变,对于这种数据类型,就称可变数据类型。
总结:不可变数据类型更改后地址发⽣改变,可变数据类型更改地址不发⽣改变
⼆、数据类型分类
在Python中数据类型有:整型,字符串,元组,集合,列表,字典。接下来查看他们分别属于不可变数据类型还是可变数据类型。
2.1 整型
>>> A = 1
>>> print(id(A),type(A))
140710074386096 <class'int'>
>>> A = 100
>>> print(id(A),type(A))
140710074389264 <class'int'>
可以发现,当数据发⽣改变后,变量的内存地址发⽣了改变,那整型就是不可变数据类型。
2.2 字符串
>>> str1 = "hello"
>>> print(id(str1),type(str1))
2150342503216 <class'str'>
>>> str1 = "helloworld"
>>> print(id(str1),type(str1))
2150342503152 <class'str'>
可以发现,当数据发⽣改变后,变量的内存地址发⽣了改变,那字符串就是不可变数据类型。
2.3 元组
元组被称为只读列表,即数据可以被查询,但不能被修改,但是我们可以在元组的元素中存放⼀个列表,通过更改列表的值来查看元组是属于可变还是不可变。
>>> list1 = [1,2,3]
>>> tup1 = (1,2,list1)
>>> print(id(tup1),type(tup1))
2150342077440 <class'tuple'>
>>> list1[2] = 100
>>> print(id(tup1),type(tup1))
2150342077440 <class'tuple'>
我们可以发现,虽然元组数据发⽣改变,但是内存地址没有发⽣了改变,但是我们不可以以此来判定元组就是可变数据类型。
我们回头仔细想想元组的定义就是不可变的。修改了元组中列表的值,但是因为列表是可变数据类型,所以虽然在列表中更改了值,但是列表的地址没有改变,列表在元组中的地址的值没有改变,所以也就意味着元组没有发⽣变化。
我们就可以认为元组是不可变数据类型,因为元组是不可变的。
2.4 集合
集合我们常⽤来进⾏去重和关系运算,集合是⽆序的。
>>> s1 = {1,2,"hello","world"}
>>> print(id(s1),type(s1))
2150342489920 <class'set'>
>>> s1.add("tom")
>>> print(id(s1),type(s1))
2150342489920 <class'set'>
我们可以发现,虽然集合数据发⽣改变,但是内存地址没有发⽣了改变,那么集合就是可变数据类型。
2.5 列表
>>> list1 = [23,45,12,"zs"]
>>> print(id(list1),type(list1))
2150342481344 <class'list'>
>>> list1.append("ls")
>>> print(id(list1),type(list1))
字符串常量不可改变
2150342481344 <class'list'>
我们可以发现,虽然列表数据发⽣改变,但是内存地址没有改变,那列表是可变数据类型。
2.6 字典
字典是python中唯⼀的映射类型,采⽤键值对(key-value)的形式存储数据。python对key进⾏哈希函数运算,根据计算的结果决定value的存储地址,所以字典是⽆序存储的。但是在3.6版本后,字典开始是有序的,这是新的版本特征。字典的key值可以是整型,字符串,元组,但是不可以是列表,集合,字典。
>>> info = {'name': 'zhangsan', 'age': 100}
>>> print(id(info),type(info))
2150342011840 <class'dict'>
>>> info['age'] = 12
>>> print(id(info),type(info))
2150342011840 <class'dict'>
我们可以发现,虽然字典数据发⽣改变,但是内存地址没有发⽣了改变,那么字典就是可变数据类型

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。