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

在基础数据类型中:

  • 数值、字符串、元组、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. recyclerview刷新

    https://blog.csdn.net/leejizhou/article/details/51179233 RecyclerView之更新UI数据的高级用法 https://www.cnblog ...

  2. Android手机app的adb命令测试电量

    Android手机app电量测试 Android 5.0及以上的设备, 允许我们通过adb命令dump出电量使用统计信息 第一步:手机安装要测试的应用,打开手机开发者模式-USB模式,运行cmd.ex ...

  3. Node.js创建本地简易服务器

    创建简易的本地服务器 安装node.js 在项目下,通过npm init -y创建package.json文件 通过npm install mime --save加载mime插件 创建server.j ...

  4. SQL语言基础学习

    9.26.对之前学习的知识进行一下梳理,同时结合所查资料对知识进行一次整合

  5. HashMap内部结构及实现原理

    简单介绍 在研究HashMap之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能 数组:采用一段连续的存储单元来存储数据.对于指定下标的查找,时间复杂度为O(1):通过给定值进行查找,需 ...

  6. 【腾讯Bugly干货分享】那些年,我们一起写过的“单例模式”

    题记 度娘上对设计模式(Design pattern)的定义是:"一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结."它由著名的"四人帮",又称 ...

  7. spring cloud 入门,看一个微服务框架的「五脏六腑」

    Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 注:Spring Boot 简单理解就是简化 Spring 项目的搭建.配置.组 ...

  8. Java核心技术卷一基础知识-第14章-多线程-读书笔记

    第 14 章 多线程 本章内容: * 什么是线程 * 中断线程 * 线程状态 * 线程属性 * 同步 * 阻塞队列 * 线程安全的集合 * Collable与Future * 执行器 * 同步器 * ...

  9. Docker学习笔记-磁盘挂载运行.netcore

    前言: 环境:centos7.5 64 位 正文: 首先我们在宿主机上安装 .NET Core SDK sudo rpm --import https://packages.microsoft.com ...

  10. 微信小程序消息通知-打卡考勤

    微信小程序消息通知-打卡考勤 效果: 稍微改一下js就行,有不必要的错误,我就不改了,哈哈! index.js //index.js const app = getApp() // 填写微信小程序ap ...