可变数据类型与不可变数据类型

本文详细介绍了Python中的数据类型,包括整型、字符串、元组、列表、集合、字典以及不可变集合frozenset。强调了可变和不可变数据类型的特性,例如整型和字符串的不可变性,以及列表、集合和字典的可变性。同时,讨论了元组的特殊情况,即使在元组内的列表元素改变,元组本身仍被视为不可变。文章还提到了frozenset在需要不可变集合时的重要性,并指出字典的键必须是不可变对象。
一、什么是可变类型与不可变类型?

可变数据类型 :当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型。

不可变数据类型: 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型。

二、数据类型分类
2.1、整型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8EGrFluj-1624436563244)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210623155855286.png)]

数据发生改变后,变量的内存地址发生了改变,所以整型是不可变数据类型

2.2、字符串

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RaLoYr7Z-1624436563246)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210623160014131.png)]

当数据发生改变后,变量的内存地址发生了改变,所以字符串就是不可变数据类型

2.3、元组

元组被称为只读列表,即数据可以被查询,但不能被修改,但是我们可以在元组的元素中存放一个列表,通过更改列表的值来查看元组是属于可变还是不可变。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aFbctG2J-1624436563247)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210623160056419.png)]

虽然元组数据发生改变,但是内存地址没有发生了改变,但是我们不可以以此来判定元组就是可变数据类型。元组的定义就是不可变的。我们修改了元组中列表的值,但是因为列表是可变数据类型,所以虽然在列表中更改了值,但是列表的地址没有改变,列表在元组中的地址的值没有改变,所以也就意味着元组没有发生变化。就可以认为元组是不可变数据类型,因为元组是不可变的。

2.4、集合

集合常用来进行去重和运算关系,集合是无序的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z0OsJtvG-1624436563250)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210623160203267.png)]

虽然集合数据发生改变,但是内存地址没有发生了改变,那么集合就是可变数据类型

2.5、不可变集合frozenset

set 集合是可变序列,程序可以改变序列中的元素;frozenset 集合是不可变序列,程序不能改变序列中的元素。set 集合中所有能改变集合本身的方法,比如 remove()、discard()、add() 等,frozenset 都不支持;set 集合中不改变集合本身的方法,fronzenset 都支持。

查看frozenset支持的方法

>>> dir(frozenset)
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'copy', 'difference', 'intersection', 'isdisjoint', 'issubset', 'issuperset', 'symmetric_difference', 'union']

可以使用frozenset的两种情况

  • 当集合的元素不需要改变时,我们可以使用 fronzenset 替代 set,这样更加安全。

  • 有时候程序要求必须是不可变对象,这个时候也要使用 fronzenset 替代 set。比如,字典(dict)的键(key)就要求是不可变对象。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h8d1Wqb4-1624436563253)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210623161951311.png)]

    set 集合本身的元素必须是不可变的, 所以 set 的元素不能是 set,只能是 frozenset。向 set 中添加 frozenset 是没问题的,因为 frozenset 是不可变的;但是,向 set 中添加子 set,这是不允许的,因为 set 是可变的。

2.6、列表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iaAUD7Uf-1624436563255)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210623160329391.png)]

列表数据发生改变,但是内存地址没有发生了改变,所以列表就是可变数据类型

2.7、字典

字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的。但是在3.6版本后,字典开始是有序的

字典的key值可以是整型,字符串,元组,但是不可以是列表,集合,字典

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZSt5YLZg-1624436563256)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210623160354070.png)]

虽然字典数据发生改变,但是内存地址没有发生了改变,所以字典就是可变数据类型

数据类型可变/不可变
整型不可变
字符串不可变
元组不可变
列表可变
集合可变
字典可变
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值