一、什么是可变类型与不可变类型?
可变数据类型 :当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型。
不可变数据类型: 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型。
二、数据类型分类
2.1、整型
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8EGrFluj-1624436563244)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210623155855286.png)]](/https://i-blog.csdnimg.cn/blog_migrate/f5f1435ce599108907980a3f3ec35b6f.png)
数据发生改变后,变量的内存地址发生了改变,所以整型是不可变数据类型
2.2、字符串
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RaLoYr7Z-1624436563246)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210623160014131.png)]](/https://i-blog.csdnimg.cn/blog_migrate/a72e345677050b553dbd3f06101af8bb.png)
当数据发生改变后,变量的内存地址发生了改变,所以字符串就是不可变数据类型。
2.3、元组
元组被称为只读列表,即数据可以被查询,但不能被修改,但是我们可以在元组的元素中存放一个列表,通过更改列表的值来查看元组是属于可变还是不可变。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aFbctG2J-1624436563247)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210623160056419.png)]](/https://i-blog.csdnimg.cn/blog_migrate/f3cad51bd6d08206c29907d64e620be0.png)
虽然元组数据发生改变,但是内存地址没有发生了改变,但是我们不可以以此来判定元组就是可变数据类型。元组的定义就是不可变的。我们修改了元组中列表的值,但是因为列表是可变数据类型,所以虽然在列表中更改了值,但是列表的地址没有改变,列表在元组中的地址的值没有改变,所以也就意味着元组没有发生变化。就可以认为元组是不可变数据类型,因为元组是不可变的。
2.4、集合
集合常用来进行去重和运算关系,集合是无序的
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z0OsJtvG-1624436563250)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210623160203267.png)]](/https://i-blog.csdnimg.cn/blog_migrate/bde95c0a95a3e368cdafd37907c0d15f.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)]](/https://i-blog.csdnimg.cn/blog_migrate/7306a70ad79e412e6aef064e450fbe75.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)]](/https://i-blog.csdnimg.cn/blog_migrate/189d0d7017bab0d93e21bd1c0c9b6abf.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)]](/https://i-blog.csdnimg.cn/blog_migrate/26ce024577ea56719c671011b1b6d1f5.png)
虽然字典数据发生改变,但是内存地址没有发生了改变,所以字典就是可变数据类型。
| 数据类型 | 可变/不可变 |
|---|---|
| 整型 | 不可变 |
| 字符串 | 不可变 |
| 元组 | 不可变 |
| 列表 | 可变 |
| 集合 | 可变 |
| 字典 | 可变 |
本文详细介绍了Python中的数据类型,包括整型、字符串、元组、列表、集合、字典以及不可变集合frozenset。强调了可变和不可变数据类型的特性,例如整型和字符串的不可变性,以及列表、集合和字典的可变性。同时,讨论了元组的特殊情况,即使在元组内的列表元素改变,元组本身仍被视为不可变。文章还提到了frozenset在需要不可变集合时的重要性,并指出字典的键必须是不可变对象。

3014

被折叠的 条评论
为什么被折叠?



