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 相关文章推荐
Python抓取Discuz!用户名脚本代码
Dec 30 Python
Python实现的生成自我描述脚本分享(很有意思的程序)
Jul 18 Python
Linux RedHat下安装Python2.7开发环境
May 20 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
Mar 11 Python
python增加图像对比度的方法
Jul 12 Python
python二维键值数组生成转json的例子
Dec 06 Python
完美解决pycharm导入自己写的py文件爆红问题
Feb 12 Python
Python3如何使用多线程升程序运行速度
Aug 11 Python
Django限制API访问频率常用方法解析
Oct 12 Python
python 带时区的日期格式化操作
Oct 23 Python
pytorch学习教程之自定义数据集
Nov 10 Python
python 模拟登陆github的示例
Dec 04 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
PHP编程风格规范分享
2014/01/15 PHP
PHP防止注入攻击实例分析
2014/11/03 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
2016/12/15 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
JS判断表单输入是否为空(示例代码)
2013/12/23 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
Angular实现表单验证功能
2017/11/13 Javascript
node作为中间服务层如何发送请求(发送请求的实现方法详解)
2018/01/02 Javascript
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
Node.js 路由的实现方法
2019/06/05 Javascript
JavaScript的变量声明与声明提前用法实例分析
2019/11/26 Javascript
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
python的set处理二维数组转一维数组的方法示例
2019/05/31 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
Python获取时间戳代码实例
2019/09/24 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
2020/02/26 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
windows10在visual studio2019下配置使用openCV4.3.0
2020/07/14 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
用HTML5制作一个简单的桌球游戏的教程
2015/05/12 HTML / CSS
德国亚洲食品网上商店:asiafoodland.de
2019/12/28 全球购物
信息系统专业个人求职信范文
2013/12/07 职场文书
网站开发实习生的自我评价
2013/12/11 职场文书
大专生求职信
2014/06/29 职场文书
银行转正自我鉴定
2014/09/29 职场文书
2016关于预防职务犯罪的心得体会
2016/01/21 职场文书
javascript数组includes、reduce的基本使用
2021/07/02 Javascript