python中不可变数据类型和可变数据类型
在学习python过程中我们⼀定会遇到不可变数据类型和可变数据类型。
1.名词解释
以下所有的内容都是基于内存地址来说的。
不可变数据类型: 当该数据类型的对应变量的值发⽣了改变,那么它对应的内存地址也会发⽣改变,对于这种数据类型,就称不可变数据类型。
可变数据类型 :当该数据类型的对应变量的值发⽣了改变,那么它对应的内存地址不发⽣改变,对于这种数据类型,就称可变数据类型。
总结:不可变数据类型更改后地址发⽣改变,可变数据类型更改地址不发⽣改变
2.数据类型分类
在python中数据类型有:整型,字符串,元组,集合,列表,字典。接下来我们⽤例⼦来⼀⼀查看他们分别属于不可变数据类型还是可变数据类型。
2.1 整型
a =1
print(id(a),type(a))
a =2
print(id(a),type(a))
1912499232<class'int'>
1912499264<class'int'>
我们可以发现,当数据发⽣改变后,变量的内存地址发⽣了改变,那么整型就是不可变数据类型。
2.2 字符串
'''
遇到问题没⼈解答?⼩编创建了⼀个Python学习交流QQ:778463939
寻有志同道合的⼩伙伴,互帮互助,⾥还有不错的视频学习教程和PDF电⼦书!
'''
b ='djx'
print(id(b),type(b))
b ='djx1996'
print(id(b),type(b))
535056476344<class'str'>
535056476624<class'str'>
我们可以发现,当数据发⽣改变后,变量的内存地址发⽣了改变,那么字符串就是不可变数据类型。
2.3 元组
元组被称为只读列表,即数据可以被查询,但不能被修改,但是我们可以在元组的元素中存放⼀个列表,通过更改列表的值来查看元组是属于可变还是不可变。
c1 =['1','2']
c =(1,2,c1)
print(c,id(c),type(c))
c1[1]='djx'
print(c,id(c),type(c))
result:
(1,2,['1','2'])386030735432<class'tuple'>
(1,2,['1','djx'])386030735432<class'tuple'>
我们可以发现,虽然元组数据发⽣改变,但是内存地址没有发⽣了改变,但是我们不可以以此来判定元组就是可变数据类型。我们回头仔细想想元组的定义就是不可变的。我们修改了元组中列表的值,但是因为列表是可变数据类型,所以虽然在列表中更改了值,但是列表的地址没有改变,列表在元组中的地址的值没有改变,所以也就意味着元组没有发⽣变化。我们就可以认为元组是不可变数据类型,因为元组是不可变的。
2.4 集合
集合我们常⽤来进⾏去重和关系运算,集合是⽆序的。
'''
遇到问题没⼈解答?⼩编创建了⼀个Python学习交流QQ:778463939
寻有志同道合的⼩伙伴,互帮互助,⾥还有不错的视频学习教程和PDF电⼦书!
'''
c1 =['1','2']
c =(1,2,c1)
print(c,id(c),type(c))
c1[1]='djx'
print(c,id(c),type(c))
result:
(1,2,['1','2'])386030735432<class'tuple'>
(1,2,['1','djx'])386030735432<class'tuple'>
我们可以发现,虽然集合数据发⽣改变,但是内存地址没有发⽣了改变,那么集合就是可变数据类型。
2.5 列表
列表是python中的基础数据类型之⼀,其他语⾔中也有类似于列表的数据类型,⽐如js中叫数组,它是以[]括起来,每个元素以逗号隔开,⽽且它⾥⾯可以存放各种数据类型。
list=[1,'q','qwer',True]
python 定义数组print(list,type(list),id(list))
list.append('djx')
print(list,type(list),id(list))
result:
[1,'q','qwer',True]<class'list'>808140621128
[1,'q','qwer',True,'djx']<class'list'>808140621128
我们可以发现,虽然列表数据发⽣改变,但是内存地址没有发⽣了改变,那么列表就是可变数据类型。
2.6 字典
字典是python中唯⼀的映射类型,采⽤键值对(key-value)的形式存储数据。python对key进⾏哈希函数运算,根据计算的结果决定value的存储地址,所以字典是⽆序存储的。但是在3.6版本后,字典开始是有序的,这是新的版本特征。
字典的key值可以是整型,字符串,元组,但是不可以是列表,集合,字典。
tuple=(1)
dic ={1:2}
d ={tuple:1,'key2':'djx','key3':'li'}
print(d,type(d),id(d))
d['key4']='haha'
print(d,type(d),id(d))
result:
{1:1,'key2':'djx','key3':'li'}<class'dict'>256310956320
{1:1,'key2':'djx','key3':'li','key4':'haha'}<class'dict'>256310956320
我们可以发现,虽然字典数据发⽣改变,但是内存地址没有发⽣了改变,那么字典就是可变数据类型。
⽤⼀句话来概括上述过程就是:
“python中的不可变数据类型,不允许变量的值发⽣变化,如果改变了变量的值,相当于是新建了⼀个对象,⽽对于相同的值的对象,在内存中则只有⼀个对象,内部会有⼀个引⽤计数来记录有多少个变量引⽤这个对象;可变数据类型,允许变量的值发⽣变化,即如果对变量进⾏append、+=等这种操作后,只是改变了变量的值,⽽不会新建⼀个对象,变量引⽤的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有⾃⼰的地址,相当于内存中对于同值的对象保存了多份,这⾥不存在引⽤计数,是实实在在的对象。”
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论