首先,我们需要知道在python中哪些是可变数据类型,哪些是不可变数据类型。可变数据类型:列表list和字典dict;不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。

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

初学python的时候,可能会有很多疑惑,尤其是最先接触的所谓的“可变数据类型”和“不可变数据类型”。python与C/C++不一样,它的变量使用有自己的特点,当初学python的时候,一定要记住“一切皆为对象,一切皆为对象的引用”这句话,其实这个特点类似于JAVA,所以在python里面大家也不用担心类似于C/C++中的指针的复杂问题。下面本文将对python里面的“可变数据类型”和“不可变数据类型”进行分析。

首先,我们需要知道在python中哪些是可变数据类型,哪些是不可变数据类型。可变数据类型:列表list和字典dict;不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。

然后,我们以int和list为例,来看看“可变数据类型”和“不可变数据类型”到底有什么区别。

(1)不可变数据类型分析。先来看一段程序:

>>> x = 1

>>> id(x)

31106520

>>> y = 1

>>> id(y)

31106520

>>> x = 2

>>> id(x)

31106508

>>> y = 2

>>> id(y)

31106508

>>> z = y

>>> id(z)

31106508

>>> x += 2

>>> id(x)

31106484

上面这段程序都是对不可变数据类型中的int类型的操作,id()查看的是当前变量的地址值。我们先来看x = 1和y = 1两个操作的结果,从上面的输出可以看到x和y在此时的地址值是一样的,也就是说x和y其实是引用了同一个对象,即1,也就是说内存中对于1只占用了一个地址,而不管有多少个引用指向了它,都只有一个地址值,只是有一个引用计数会记录指向这个地址的引用到底有几个而已。当我们进行x = 2赋值时,发现x的地址值变了,虽然还是x这个引用,但是其地址值却变化了,后面的y = 2以及z = y,使得x、y和z都引用了同一个对象,即2,所以地址值都是一样的。当x和y都被赋值2后,1这个对象已经没有引用指向它了,所以1这个对象占用的内存,即31106520地址要被“垃圾回收”,即1这个对象在内存中已经不存在了。最后,x进行了加2的操作,所以创建了新的对象4,x引用了这个新的对象,而不再引用2这个对象。

那么为什么称之为不可变数据类型呢?这里的不可变大家可以理解为x引用的地址处的值是不能被改变的,也就是31106520地址处的值在没被垃圾回收之前一直都是1,不能改变,如果要把x赋值为2,那么只能将x引用的地址从31106520变为31106508,相当于x = 2这个赋值又创建了一个对象,即2这个对象,然后x、y、z都引用了这个对象,所以int这个数据类型是不可变的,如果想对int类型的变量再次赋值,在内存中相当于又创建了一个新的对象,而不再是之前的对象。从下图中就可以看到上面程序的过程。

图1 python不可变数据类型分析

从上面的过程可以看出,不可变数据类型的优点就是内存中不管有多少个引用,相同的对象只占用了一块内存,但是它的缺点就是当需要对变量进行运算从而改变变量引用的对象的值时,由于是不可变的数据类型,所以必须创建新的对象,这样就会使得一次次的改变创建了一个个新的对象,不过不再使用的内存会被垃圾回收器回收。

(2)可变数据类型分析。下面同样先看一段程序。

>>> a = [1, 2, 3]

>>> id(a)

41568816

>>> a = [1, 2, 3]

>>> id(a)

41575088

>>> a.append(4)

>>> id(a)

41575088

>>> a += [2]

>>> id(a)

41575088

>>> a

[1, 2, 3, 4, 2]

从上面的程序中可以看出,进行两次a = [1, 2, 3]操作,两次a引用的地址值是不同的,也就是说其实创建了两个不同的对象,这一点明显不同于不可变数据类型,所以对于可变数据类型来说,具有同样值的对象是不同的对象,即在内存中保存了多个同样值的对象,地址值不同。接着来看后面的操作,我们对列表进行添加操作,分别a.append(4)和a += [2],发现这两个操作使得a引用的对象值变成了上面的最终结果,但是a引用的地址依旧是41575088,也就是说对a进行的操作不会改变a引用的地址值,只是在地址后面又扩充了新的地址,改变了地址里面存放的值,所以可变数据类型的意思就是说对一个变量进行操作时,其值是可变的,值的变化并不会引起新建对象,即地址是不会变的,只是地址中的内容变化了或者地址得到了扩充。下图对这一过程进行了图示,可以很清晰地看到这一过程。

图2 python可变数据类型分析

从上述过程可以看到,可变数据类型是允许同一对象的内容,即值可以变化,但是地址是不会变化的。但是需要注意一点,对可变数据类型的操作不能是直接进行新的赋值操作,比如说a = [1, 2, 3, 4, 5, 6, 7],这样的操作就不是改变值了,而是新建了一个新的对象,这里的可变只是对于类似于append、+=等这种操作。

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

最后,大家主要区分开什么是变量值的变化、什么是变量引用的对象地址的变化这些概念就很清楚了,千说万说都不如自己动手写一些程序测试一下看看来得实在,所以建议大家有什么疑惑可以自己写一些基本的程序测试一下便知道结果。如果大家有新的意见,欢迎补充,谢谢。

python中哪些类型数据是不可变的_python的可变与不可变数据类型相关推荐

  1. python查看dataframe数据类型_python pandas中DataFrame类型数据操作函数的方法

    python数据分析工具pandas中DataFrame和Series作为主要的数据结构. 本文主要是介绍如何对DataFrame数据进行操作并结合一个实例测试操作函数. 1)查看DataFrame数 ...

  2. python dataframe函数_python pandas中DataFrame类型数据操作函数的方法

    这篇文章主要介绍了关于python pandas中DataFrame类型数据操作函数的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 python数据分析工具pandas中Data ...

  3. python中字典类型中的item是什么-Python中的基本数据类型之字典类型

    字典类型是键值对构成的数据类型,也就是一个键对应一个值,对于存储某些一一对应数据十分的方便 字典的创建 #在Python中字典类型是dict类型 a = {"name":" ...

  4. 全面理解Python中的类型提示(Type Hints)

    众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...

  5. 在Python中检查类型的规范方法是什么?

    检查给定对象是否为给定类型的最佳方法是什么? 如何检查对象是否从给定类型继承? 假设我有一个对象o . 如何检查是否为str ? #1楼 前往雨果: 您可能是说list而不是array ,但这指向类型 ...

  6. python类型转换-Python中如何进行数据类型转换?

    原标题:Python中如何进行数据类型转换? 这一次要讲的是Python中的数据类型转换,Python中的数据类型转换是什么?就是将数据由当前类型变化为其他类型的操作就是数据类型转换.数据类型转换分为 ...

  7. 什么是数据标准化?在Python中如何进行数据标准化?「必学」

    转载:https://www.toutiao.com/i6644145067256709645/?tt_from=weixin&utm_campaign=client_share&wx ...

  8. python中字典类型中的item是什么-python中 字典类型内置方法

    python中 字典类型内置方法 一.字典(dict) ​ 1·. 存多个值,但是每一个值都有一个key与之对应.列如存在值有姓名:jiayi.年龄:18.身高:173 ​ 2.定义方式 ​ 在{}内 ...

  9. python csv库,Python 中导入csv数据的三种方法

    Python 中导入csv数据的三种方法,具体内容如下所示: 1.通过标准的Python库导入CSV文件: Python提供了一个标准的类库CSV文件.这个类库中的reader()函数用来导入CSV文 ...

最新文章

  1. 如何让黑白图片恢复“生机”
  2. python亲和度_数据挖掘——亲和性分析
  3. Linux命令之hexdump - ”十六“进制查看器
  4. 51 Python - 装饰器 参数化装饰器——装饰器更通用
  5. 目标检测论文阅读:Cascade R-CNN: Delving into High Quality Object Detection(CVPR2018)
  6. SAP编程中最基本的概念
  7. Pyplot绘图的格式
  8. UE3 iPhonePackager 工具
  9. 深度学习之激活函数篇(Sigmoid、tanh、ReLU、PReLU)
  10. python的装饰器迭代器与生成器_详解python中的生成器、迭代器、闭包、装饰器
  11. 如何用EasyRecovery找回回收站信息(附注册机下载地址)
  12. NAGA-Ⅱ与QPSO算法求解下层为非合作博弈模型的双层规划组合优化模型(铁路开行方案)
  13. 【计算机组成原理】寄存器的本质——锁存器
  14. 三角形各种心的代数几何性质
  15. raid读写速度对比_组建RAID 0前后的读写速度对比
  16. 俄罗斯方块Tetris Beat for Mac(休闲益智游戏)
  17. 经纬度坐标转为上海地方坐标代码(js代码)
  18. iPhone6 微信视频通话没有声音
  19. chi2inv函数 matlab_matlab函数列表(A~Z)【转】
  20. 森林防火监控系统解决方案及标准权威解读

热门文章

  1. 电子作业票系统:以“智能”拧紧危化安全生产“安全阀”
  2. ubuntu下发射wifi热点
  3. 数据增强在卷积神经网络中的应用
  4. 帮妈妈做保洁的男孩被北大录取了
  5. 黑马Luence小结
  6. HDU A simple stone game [K倍动态减法游戏]
  7. 绩效管理方式的升级,极有可能在2023年让组织绩效提升5%-10%
  8. 10-205 在顾客表中查询顾客编号,公司名称和所在城市这三项内容
  9. 关于《伤心者》,关于那些看不到结果的努力
  10. 20179311《网络攻防实践》第八周作业