数据类型分为可变、不可变。可变对象表示可以原处修改该数据对象,不可变对象表示必须创建新对象来保存修改后的数据。

在基础数据类型中:

  • 数值、字符串、元组、frozenset是不可变对象
  • 列表、set、dict是可变对象

对于可变对象,比如有一个列表L,查看它的id以及第一个元素的id。

>>> L = ['a', 'b', 'c']>>> id(L)
23099392
>>> id(L[0])
57027008

这意味着在内存中有一片区域,这片区域存放的数据类型是列表(每个数据对象都有自己的类型声明),列表包含至少3个数据内存块,分别存放了3个字符串类型的数据(实际上是存放了这3个字符对象的地址)。如下图所示:

可变对象(不仅仅是这里的序列、列表)意味着修改该数据对象,不会在内存中新创建另一个内存空间来存放新数据对象。例如,修改这个列表中的第一个元素为"aa"。

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> L[0]="aa"
>>> L
['aa', 'b', 'c']
>>> id(L)
23099392

发现列表的id并没有改变,也就是列表的内存地址仍然是那一块。这表示列表是可变序列。

但是,如果查看第一个元素的id,会发现已经改变了:

>>> id(L[0])
61863232

这说明,虽然列表的内存地址没有改变,但是列表中的第一个元素的地址已经改变了。实际上,上面修改列表元素后的列表结构变成如下图所示:

也就是说,修改列表中的第一个元素过程中,创建了一个新的内存块来存放新的字符串,原始的那个字符串"a"因为没有被引用了,它将等待垃圾回收器的回收。不管如何,列表的地址一直没变。

为什么修改列表中的元素需要创建新的内存块?这是因为这个元素是字符串,而字符串是不可变对象。

不可变对象意味着,不能在原始内存地址块中修改数据,必须新创建一个地址块来保存修改后的数据对象。正如上面修改字符串"a"为"aa"的结果。

假如列表L中的第一个元素仍然是一个嵌套在L中的列表,因为列表是可变对象,现在修改L的第一个元素,这第一个元素的地址不会改变。

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> L = [['a'], 'b', 'c']>>> id(L[0])
23099392
>>> L[0][0] = "aa"
>>> id(L[0])
23099392

这里改变的只有内嵌的列表中第一个元素的地址。

虽然可变对象可以原处修改数据,不会创建新对象,但并不意味着操作可变对象总是不会创建新对象,这取决于对可变对象做什么操作,比如分片操作一定会创建新对象。

python基础教程:对可变对象和不可变对象的详解相关推荐

  1. jeesite如何配置swagger_Spring Boot 2.x基础教程:Swagger接口分类与各元素排序问题详解...

    之前通过Spring Boot 2.x基础教程:使用Swagger2构建强大的API文档一文,我们学习了如何使用Swagger为Spring Boot项目自动生成API文档,有不少用户留言问了关于文档 ...

  2. 【Markdown基础教程】分割线,删除线与下划线详解

    新的一篇又开始了 在这篇文章中,我会对Markdown分割线,删除线,下划线做一个详细介绍 我们进行之前,先了解这些都是什么 分割线: 删除线: 我被删除啦 下划线: 看我身下的横线 其实分割线不应该 ...

  3. java me基础教程 pdf_Java ME手机应用开发技术与案例详解 PDF

    资源名称:Java ME手机应用开发技术与案例详解 PDF Java ME手机应用开发技术与案例详解基于Java ME,系统描述了Java ME手机应用开发的各个方面.全书按照Java ME程序的开发 ...

  4. python基础教程第二版和第三版哪个好-python基础教程 2版和3版哪个适合新手?!...

    python基础教程 2版和3版哪个适合新手? 现在学是学python3. 两者的差异发者本身影响并不大,个别语法细微的差比如python3的print数方式使用,一些常用模块的名称差异,一些机制的差 ...

  5. python基础教程视频(全13集)-Python基础视频教程(600集)【传智播客精品教程】...

    Python基础视频教程 初级共600节课 本套视频是传智播客紧抓未来最大趋势--人工智能,应运而生的一套Python入门视频教程,Python是学习人工智能的首选语言,而该视频是专门针对零基础的学员 ...

  6. python基础教程第三版和第二版选哪个-python基础教程 2版和3版哪个适合新手?!...

    python基础教程 2版和3版哪个适合新手? 现在学是学python3. 两者的差异发者本身影响并不大,个别语法细微的差比如python3的print数方式使用,一些常用模块的名称差异,一些机制的差 ...

  7. python基础教程-学习python有什么好的视频教程?

    干货来袭,以下均为python好的学习视频,我们先从python的入门教程开始分享起! python入门教程(600集)https://www.bilibili.com/video/BV1ex411x ...

  8. python基础教程电子版-Python基础教程(第2版 修订版) pdf

    Python基础教程(第2版 修订版) 目录 D11章快速改造:基础知识1 1.1安装Python1 1.1.1Windows1 1.1.2Linux和UNIX3 1.1.3苹果机(Macintosh ...

  9. python基础教程-Python入门教程完整版(懂中文就能学会)

    提取码:sjfo 目录大纲: 本套教程15天 学前环境搭建 1-3 天内容为Linux基础命令 4-13 天内容为Python基础教程 14-15 天内容为 飞机大战项目演练 视频概括: 第一阶段(1 ...

  10. 下载python教程-Python基础教程下载【黑马程序员完整版】

    课程介绍 目录大纲: 1-3 天内容为Linux基础命令 4-13 天内容为Python基础教程 14-15 天内容为 飞机大战项目演练 视频概括: 第一阶段(1-3天): 该阶段首先通过介绍不同领域 ...

最新文章

  1. ImageNet 存在十万标签错误,你知道吗?
  2. opencv源码解析之(6):hog源码分析
  3. python3最新稳定版本-Python 3.9.0 稳定版发布
  4. 如何:为 Windows 窗体 RichTextBox 控件设置字体属性
  5. c/c++ 继承与多态 文本查询的小例子(非智能指针版本)
  6. postgres大版本升级
  7. Safari browser and asp.net Menu control (asp:Menu)
  8. mysql原生库_Mysql数据库的一些简单原生sql语句
  9. c语言求偶数的积,《动物的多*语言》阅读理解及*
  10. Flask详解(中篇)
  11. 光纤OTDR测试是端到端损耗原理
  12. 钛资本研究院:全球产业链重构下的芯片机遇
  13. 一次系统宕机认识系统日志
  14. 用前端代码智能识别身份证的头像
  15. 家用洗地机器人哪个牌子好性价比高?家用洗地机品牌排行榜前十名
  16. 写了一个增量式的爬虫,但是并不完美,希望大牛们可以指正指正!
  17. kitty猫的基因编码
  18. 常用遥感卫星数据汇总
  19. 源码多多-Discuz x2.5 论坛防灌水机制分析和设置方法
  20. Linux中Lun是什么,以及和存储卷的区别

热门文章

  1. c#中结构体和类的比较
  2. 腾讯下载的视频转换为MP4
  3. Android开发中adb命令的常用方法
  4. python操作Excel读写--使用xlrd
  5. 大道至简第五章阅读笔记
  6. 设计模式(中介者模式)
  7. 示例演示数据压缩的效果
  8. SpringMvc多视图整合(jsp、velocity、freemarker)
  9. 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!...
  10. SharePoint技术峰会2009视频(6)