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二叉树的实现实例
Nov 21 Python
linux系统使用python监测网络接口获取网络的输入输出
Jan 15 Python
python插入数据到列表的方法
Apr 30 Python
python基于Tkinter库实现简单文本编辑器实例
May 05 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 Python
解决python大批量读写.doc文件的问题
May 08 Python
Appium Python自动化测试之环境搭建的步骤
Jan 23 Python
Python魔法方法功能与用法简介
Apr 04 Python
Python计算机视觉里的IOU计算实例
Jan 17 Python
python 删除excel表格重复行,数据预处理操作
Jul 06 Python
python实现简单猜单词游戏
Dec 24 Python
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
Jun 09 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 存储文本换行实现方法
2010/01/05 PHP
一个简单的php加密解密函数(动态加密)
2013/06/19 PHP
教你识别简单的免查杀PHP后门
2015/09/13 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
php正则修正符用法实例详解
2016/12/29 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
jquery CSS选择器笔记
2010/03/29 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
2013/11/26 Javascript
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
NodeJs基本语法和类型
2015/02/13 NodeJs
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
JS+HTML5实现图片在线预览功能
2017/07/22 Javascript
vue使用axios时关于this的指向问题详解
2017/12/22 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
js实现抽奖功能
2020/11/24 Javascript
用Python制作检测Linux运行信息的工具的教程
2015/04/01 Python
解读Python中degrees()方法的使用
2015/05/18 Python
100行python代码实现跳一跳辅助程序
2018/01/15 Python
python实现flappy bird小游戏
2018/12/24 Python
python3.5安装python3-tk详解
2019/04/26 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
python 模拟登陆github的示例
2020/12/04 Python
用60行代码实现Python自动抢微信红包
2021/02/04 Python
运动服饰每月订阅盒:Ellie
2018/04/29 全球购物
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
公司中层干部的自我评价分享
2014/03/01 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
党的群众路线对照检查材料思想汇报(学校)
2014/10/04 职场文书
单身申明具结书
2015/02/26 职场文书
综合素质评价自我评价
2015/03/06 职场文书
食品安全主题班会
2015/08/13 职场文书
对PyTorch中inplace字段的全面理解
2021/05/22 Python
MySQL子查询中order by不生效问题的解决方法
2021/08/02 MySQL
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python
python中 Flask Web 表单的使用方法
2022/05/20 Python