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'>

View Code

我们可以发现,当数据发生改变后,变量的内存地址发生了改变,那么整型就是不可变数据类型

  2.2 字符串

b = 'djx'
print(id(b),type(b))
b = 'djx1996'
print(id(b),type(b))535056476344 <class 'str'>
535056476624 <class 'str'>

View Code

我们可以发现,当数据发生改变后,变量的内存地址发生了改变,那么字符串就是不可变数据类型

    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'>

View Code

我们可以发现,虽然元组数据发生改变,但是内存地址没有发生了改变,但是我们不可以以此来判定元组就是可变数据类型。我们回头仔细想想元组的定义就是不可变的。我们修改了元组中列表的值,但是因为列表是可变数据类型,所以虽然在列表中更改了值,但是列表的地址没有改变,列表在元组中的地址的值没有改变,所以也就意味着元组没有发生变化。我们就可以认为元组是不可变数据类型,因为元组是不可变的。

  2.4  集合

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

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'>

View Code

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

  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

View Code

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

  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

View Code

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

数据类型 可变/不可变
整型 不可变
字符串 不可变
元组 不可变
列表 可变
集合 可变
字典 可变

用一句话来概括上述过程就是:

“python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。”

转载于:https://www.cnblogs.com/shangping/p/11368236.html

可变与不可变数据类型详解相关推荐

  1. SQL Server 2005 常用数据类型详解

    SQL Server 2005 常用数据类型详解 [b]1. 字符串数据类型[/b] char 此数据类型可存储1~8000个定长字符串,字符串长度在创建时指定:如未指定,默认为char(1).每个字 ...

  2. Python中的list/tuple/dict/set数据类型详解

    Python中的list/tuple/dict/set数据类型详解 Python内部内置了一些数据类型与结构,可以方便在编程时候的使用. list List存储一系列的有序集合,并且元素内容可变(可更 ...

  3. python六大数据类型详解

    python 六大数据类型详解 文章目录 python 六大数据类型详解 数据类型简介 Number(数值) String(字符串) Python字符串的45个方法详解 一.大小写转换 01.capi ...

  4. Python数据类型详解03

    原文博客地址: Python数据类型详解03 第一篇Python数据类型详解01中主要介绍了Python中的一些常用的数据类型的基础知识 第二篇Python数据类型详解02文章中, 详细介绍了数字(N ...

  5. MySQL数据库,从入门到精通:第十二篇——MySQL数据类型详解

    MySQL数据库,从入门到精通:第十二篇--MySQL数据类型详解 第 12 章_MySQL数据类型精讲 1. MySQL中的数据类型 2. 整数类型 2. 1 类型介绍 2. 2 可选属性 2. 2 ...

  6. python 子字符串 位置_python查找子字符串位置Python变量和数据类型详解

    Python变量和数据类型 Python中数据类型 Python之print语句 Python的注释 Python中什么是变量 Python中定义字符串 Python中raw字符串与多行字符串 Pyt ...

  7. 为什么要设定PHP数据类型,php数据类型详解

    php数据类型详解 PHP 支持8种基本的数据类型. 四种标量类型: boolean (布尔型)integer (整型)float (浮点型, 也称作 double)string (字符串) 两种复合 ...

  8. (02)System Verilog logic数据类型详解

    (02)System Verilog logic数据类型详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog logic数据类型详解 ...

  9. (03)System Verilog 常用数据类型详解

    (03)System Verilog 常用数据类型详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog 常用数据类型详解 5)结语 1 ...

  10. Redis数据类型详解(五种)

    Redis支持五种数据类型,即string(字符串).hash(哈希).list(列表).set(集合)及zset(sorted set:有序集合),云吞铺子分享Redis数据类型谅解: Redis数 ...

最新文章

  1. apache评分表的意义_APACHE评分系统及评分表
  2. 如何把单精度二进制数转换成十进制数?
  3. VS2013运行报错error C4996: 'scanf': This function or variable may be unsafe.
  4. c语言24点程序,C语言24点问题
  5. Node — 第二天
  6. 敏捷结果30天之第十二天:效率角色-你是启动者还是完成者
  7. PSPad 免费文本编辑器推荐
  8. Eclipse 中 去掉 行末端(尾部) 的 空格。(需要「AnyEdit」插件)
  9. Html5+Css3小试牛刀
  10. php entity,PHP html_entity_decode() 函数_程序员人生
  11. hasOwnProperty()方法与in操作符
  12. 【数据库】SQL建表
  13. backup exec linux卸载,Symantec Backup Exec 2012 Agent for Linux 卸载
  14. 苹果开场铃声 android,推荐几款免费安卓、苹果手机铃声剪辑软件?
  15. 关于调试模块BC26-移远NB模块-过程所遇问题-记录
  16. aplay 源码分析
  17. 欧姆龙Fins协议(FinsUDP/FinsTCP)
  18. Quick Search(windows文件搜索工具)官方中文版V5.35.1.134 | 电脑文件快速查找工具下载
  19. cout输出中加入双引号
  20. python电影数据分析报告_Python进行电影数据分析及可视化

热门文章

  1. docker配置data-root:设置镜像存储路径 镜像加速地址 私有仓库
  2. Go gin静态文件的使用、自定义模板渲染器
  3. Arrays.asList(arr)使用注意事项
  4. 【面试题视频讲解】TreeSet使用示例
  5. JDBC的批处理操作
  6. 【软考-软件设计师】计算机安全
  7. Scala伴生类和伴生对象
  8. TCP通信文件上传原理
  9. 【已解决】Win7搭建Python环境:Eclipse + PyDev插件
  10. 为啥地址线是20根则存储单元个数为2的20