python中的不可变数据类型与可变数据类型详解


Posted in Python onSeptember 16, 2018

前言

python与C/C++不一样,它的变量使用有自己的特点,当初学python的时候,一定要记住“一切皆为对象,一切皆为对象的引用”这句话,其实这个特点类似于JAVA,所以在python里面大家也不用担心类似于C/C++中的指针的复杂问题, 在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 字符串

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 集合

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

s = {1,'d','34','1',1}
print(s,type(s),id(s))
s.add('djx')
print(s,type(s),id(s))

result:
{'d', 1, '34', '1'} <class 'set'> 870405285032
{1, '34', 'djx', '1', 'd'} <class 'set'> 870405285032

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

2.5 列表

列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,它是以[]括起来,每个元素以逗号隔开,而且它里面可以存放各种数据类型。

list = [1,'q','qwer',True]
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 相关文章推荐
在树莓派2或树莓派B+上安装Python和OpenCV的教程
Mar 30 Python
Python聊天室实例程序分享
Jan 05 Python
Python生成器定义与简单用法实例分析
Apr 30 Python
Python 中的lambda函数介绍
Oct 10 Python
对django中render()与render_to_response()的区别详解
Oct 16 Python
Python根据欧拉角求旋转矩阵的实例
Jan 28 Python
浅析PEP572: 海象运算符
Oct 15 Python
django框架forms组件用法实例详解
Dec 10 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
Python实现投影法分割图像示例(二)
Jan 17 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
Mar 28 Python
基于Python中Remove函数的用法讨论
Dec 11 Python
Python连接Mssql基础教程之Python库pymssql
Sep 16 #Python
python将秒数转化为时间格式的实例
Sep 16 #Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
Sep 14 #Python
编写多线程Python服务器 最适合基础
Sep 14 #Python
不管你的Python报什么错,用这个模块就能正常运行
Sep 14 #Python
Python文件读写保存操作的示例代码
Sep 14 #Python
python一键去抖音视频水印工具
Sep 14 #Python
You might like
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
PHP5.4中json_encode中文转码的变化小结
2013/01/30 PHP
排序算法之PHP版快速排序、冒泡排序
2014/04/09 PHP
详谈php中 strtr 和 str_replace 的效率问题
2017/05/14 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
js 程序执行与顺序实现详解
2013/05/13 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
基于javascript实现tab选项卡切换特效调试笔记
2016/03/30 Javascript
jQuery页面加载初始化的3种方法(推荐)
2016/06/02 Javascript
js插件dropload上拉下滑加载数据实例解析
2016/07/27 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
Mac下使用charles遇到的问题以及解决办法
2017/01/10 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
基于redis的小程序登录实现方法流程分析
2020/05/25 Javascript
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
python中比较两个列表的实例方法
2019/07/04 Python
深入浅析python的第三方库pandas
2020/02/13 Python
python 下划线的不同用法
2020/10/24 Python
HTML5 拖拽批量上传文件的示例代码
2018/03/28 HTML / CSS
HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
2013/04/24 HTML / CSS
办公室主任职责范文
2013/11/08 职场文书
市场营销专科应届生求职信
2013/11/24 职场文书
证券期货行业个人的自我评价
2013/12/26 职场文书
偷看我的初中毕业鉴定
2014/01/29 职场文书
仓库文员岗位职责
2014/04/06 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
门面房租房协议书
2014/08/20 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
募捐感谢信
2015/01/22 职场文书
react如何快速设置文件路径别名
2021/04/28 Javascript
简单介绍Python的第三方库yaml
2021/06/18 Python
Python获取指定日期是"星期几"的6种方法
2022/03/13 Python
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android