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

在基础数据类型中:

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

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

>>> L = ['a', 'b', 'c']

>>> id(L)
23099392
>>> id(L[0])
57027008

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

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

>>> L[0]="aa"
>>> L
['aa', 'b', 'c']
>>> id(L)
23099392

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

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

>>> id(L[0])
61863232

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

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

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

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

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

>>> L = [['a'], 'b', 'c']

>>> id(L[0])
23099392
>>> L[0][0] = "aa"
>>> id(L[0])
23099392

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

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

python可变对象和不可变对象的解释的更多相关文章

  1. 【Python】可变对象和不可变对象

    Python在heap中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容是可变的,例如list.而不可变的对象则相反,表示其内容不可变. 不可变对象:int,string,flo ...

  2. Python 可变对象和不可变对象

    具体可以看这里:http://thomaschen2011.iteye.com/blog/1441254 不可变对象:int,string,float,tuple 可变对象   :list,dicti ...

  3. Python中的可变对象和不可变对象

    Python中的可变对象和不可变对象 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一 ...

  4. python,可变对象,不可变对象,深拷贝,浅拷贝。

    学习整理,若有问题,欢迎指正. python 可变对象,不可变对象 可变对象 该对象所指定的内存地址上面的值可以被改变,变量被改变后,其所指向的内存地址上面的值,直接被改变,没有发生复制行为,也没有发 ...

  5. python函数默认参数为可变对象的理解

    1.代码在执行的过程中,遇到函数定义,初始化函数生成存储函数名,默认参数初识值,函数地址的函数对象. 2.代码执行不在初始化函数,而是直接执行函数体. 代码实例 这要从函数的特性说起,在 Python ...

  6. python 中的可变对象与不可变对象

    近日辞职待工,没有实际的项目与大家分享.暂写写在实际运用python中遇到的关于可变对象和不可变对象的坑. 首先我们需要明确一个概念,在python中一且皆对象.我们一般定义一个变量a=0,其实质a是 ...

  7. python可变对象与不可变对象的差别

    一.可变对象和不可对象 Python在heap中分配的对象分成两类:可变对象和不可对象.所谓可变对象是指,对象的内容可变,而不可变对象是指内容不可变.   不可变对象:int.string.float ...

  8. python学习(28) 浅谈可变对象的单例模式设计

    python开发,有时候需要设计单例模式保证操作的唯一性和安全性.理论上python语言底层实现和C/C++不同,python采取的是引用模式,当一个对象是可变对象,对其修改不会更改引用的指向,当一个 ...

  9. Python入门之python可变对象与不可变对象

    本文分为如下几个部分 概念 地址问题 作为函数参数 可变参数在类中使用 函数默认参数 类的实现上的差异 概念 可变对象与不可变对象的区别在于对象本身是否可变. python内置的一些类型中 可变对象: ...

  10. python可变对象与不可变对象

    可变/不可变对象定义 不可变对象 该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址. 可 ...

随机推荐

  1. [f]聊天的时间格式化

    代码如下: 参数: t: 时间戳, type:返回格式(1:IM界面,其他:会话列表) function formartTime(t, type) { var oldtime = new Date(t ...

  2. spring 5.1.2 mvc RequestMappingHandlerMapping 源码初始化过程

    RequestMappingHandlerMapping getMappingForMethod RequestMappingHandlerMapping 继承于 AbstractHandlerMet ...

  3. python之路(七)-递归算法

    递归 特点 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解. 递归算法解决问题的特点: (1) 递归就是在 ...

  4. poj 1026

    这题一开始没看清楚 等级差距不超过1 1->2->3 就是错误的,因为3-1==2 ,意思是间接的也不行 其次等级最小是1,最大是n 你要到达1号首领的位置 假设1号等级x,限制m,最大上 ...

  5. Fiddler的配置

    增加监控请求的详情时间  //添加请求的响应时间 public static BindUIColumn("Time Taken")           function CalcT ...

  6. JavaScript视频分享,学无止境。

    http://blog.sina.com.cn/s/blog_735ed39a0102voy3.html

  7. Visualizing the Git data model

    I wrote a small tool git-graph.py over the weekend which can be used to generate the object graph of ...

  8. nodejs常用代码片段

    自动创建目录(多级) 相比起使用递归创建,调用 sheljsl 模块简单得多 const shell = require('shelljs') const fs = require('fs') if ...

  9. 51nod OJ P1000 A+B

    P1000 A+B OJ:51Nod 链接:"http://www.51nod.com/Challenge/Problem.html#!#problemId=1000" 题目描述: ...

  10. 110道python面试笔试题汇总,你能答对几道?

    数据分析系列教程插播一篇面试题教程,最近公众号新来了不少朋友,这几天不少粉丝留言说问我有没有python面试题,其实之前分享过一些面试题,今天统一再给大家分享一遍,也希望能帮助此时仍在找工作的同学,尽 ...