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中输出ASCII大文字、艺术字、字符字小技巧
Apr 28 Python
python使用append合并两个数组的方法
Apr 28 Python
在Linux系统上部署Apache+Python+Django+MySQL环境
Dec 24 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
python队列通信:rabbitMQ的使用(实例讲解)
Dec 22 Python
python 日志增量抓取实现方法
Apr 28 Python
django 快速启动数据库客户端程序的方法示例
Aug 16 Python
使用python客户端访问impala的操作方式
Mar 28 Python
python3.7.2 tkinter entry框限定输入数字的操作
May 22 Python
用Python创建简易网站图文教程
Jun 11 Python
Python内置数据结构列表与元组示例详解
Aug 04 Python
使用Python通过企业微信应用给企业成员发消息
Apr 18 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实现汉字验证码和算式验证码的方法
2015/03/07 PHP
微信公众号开发之文本消息自动回复php代码
2016/08/08 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
JavaScript与函数式编程解释
2007/04/27 Javascript
JavaScript中的Location地址对象
2008/01/16 Javascript
js 操作符实例代码
2009/10/24 Javascript
javascript 保存文件到本地实现方法
2012/11/29 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
javascript拖拽应用实例(二)
2016/03/25 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
bootstrap3中container与container_fluid外层容器的区别讲解
2017/12/04 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
vue项目中使用scss的方法步骤
2019/05/16 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
[58:21]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第二场
2018/04/04 DOTA
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
django启动uwsgi报错的解决方法
2018/04/08 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
Python自带的IDE在哪里
2020/07/01 Python
Python字典dict常用方法函数实例
2020/11/09 Python
matplotlib 范围选区(SpanSelector)的使用
2021/02/24 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
携程英文网站:Trip.com
2017/02/07 全球购物
Banana Republic欧盟:美国都市简约风格的代表品牌
2018/05/09 全球购物
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
优秀乡村医生先进事迹材料
2014/08/23 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书
竞聘开场白方式有哪些?
2019/08/28 职场文书
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript