关于Python中的可变对象与不可变对象的区别

2023-11-07

Python中的可变对象与不可变对象

什么是可变对象/不可变对象:

可变对象:对象存放在地址中的值不会被改变(所谓的改变是创建了一块新的地址并把新的对象的值放在新地址中原来的对象并没有发生变化)

不可变对象:对象存放在地址中的值会原地改变

int str float tuple 都属于不可变对象 其中tuple有些特殊(下文解释) 

dict set list 属于可变对象

不可变对象实例:

性质1:

首先,看一下int类型:

a=1
b=1
c=a+0
print(a is b)
print(a is c)

is是对两个变量的id是否相等做出判断如果相等那么返回true 否则返回false

可以发现上述代码最终结果是打印了两个true

这里float str类型不再一一列出如果有兴趣可以自己调试一下发现 此类不可变变量有这样一个性质:

在除了tuple的不可变变量中,只要两个变量的数据类型相同并且值也相等,那么这两个变量的地址也相同

tuple是不符合这一性质的

a=(1,2,3)
b=(1,2,3)
print(a is b)

返回false 

这就是tuple相对于其他不可变变量的特殊性

上述不可变变量性质的优点在于减少了重复的值对内存空间的占用

性质2:

变量的不可变具体不可变在哪?

来看下面的代码:

i=73
print(id(i))
i+=2
print(id(i))

可以看出上面代码的运行结果a的值发生变化后地址也变了,工作原理如下图所示:


需要注意的是i是一个变量,它指向对象的内容是73,当执行i+=2时,首先创建出一个新的内存里面存放改变后的值(75),然后让i指向新的地址,这是不可变对象在“改变”时的执行步骤,原来的对象内容和内存并没有发生变化

我们再来看一下字符串:

a="abc"
print(a.replace("a","A"))
print(a)

a执行replace 后把里面的“a”换成了“A“相当于创建的新的地址存放”Abc“ ,但是并没有再让a指向这块新的地址所以a并没有变化,通过这一性质我们可以推出:对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。

可变对象实例:

关于可变对象,是不满足上述的不可变对象性质一的而性质二刚好相反

可变对象对于自身的任意方法,是不需要重新开辟内存空间的,而是原地改变:

m=[5,9]
m.append(6)
print(m)

m的值变为了[5,9,6]当执行append时由于m是list类型属于可变对象所以它不会开辟新的内存空间而是像下图一样原地改变其值:


注意:

当list用“+”来运算时会开辟新的内存空间

a1 = [1, 2, 3]
a2 = a1
print(id(a1), id(a2))
# 实际上是a2指向了新的对象,id已经改变。
# 所以现在a2、a1并不是同一对象的两个引用了,a2变化a1不会改变
a2 = a2 + [4] # 这个等式中,右边的a2还是和a1的id一样的,一旦赋值成功,a2就指向新的对象
print(id(1), id(a2))  # 不等,a2的id变化了
print(a1) # [1, 2, 3]没有变

如果是这样写:

a1 = [1, 2, 3]
a2 = a1
print(id(a1), id(a2))
a2 += [4]  # 相当于调用了a2.extend([4]),原地改变并没有新的对象产生
print(id(1), id(a2))  # 相等,a2的id没有变化
print(a1) 

不同的地方在于a2 += [4],这句相当于调用了a2.extend([4])相当于原地改变,并没有新的对象产生。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Python中的可变对象与不可变对象的区别 的相关文章

  • ESP32上实现LVGL的界面显示

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 元器件 二 导入库 三 调试TFT eSPI 四 调试LVGL 总结 前言 基于Vscode中的 PlatformIO平台arduino框架 使用1 8
  • nrm安装报错,解决方案

    nrm安装报错 下方为错误信息 C Users kefu gt nrm version internal validators js 124 throw new ERR INVALID ARG TYPE name string value
  • vue-codemirror设置输入自定义提示效果

    概要 提示 通过使用 vue codemirror 4 0 6 实现输入提示 类似于vscode提示效果 效果图 实现原理 1 得到光标位置 定义提示内容 handleShowHint 获取输入框实例 const cmInstance th
  • 列表和元组

    1序列概述 序列是Python中最基本的数据结构 序列中的每个元素都分配一个数字 它的位置 或索引 第一个索引是0 第二个索引是1 依此类推 Python中 常见序列有列表 元组 字符串 序列可以进行的操作 有索引 切片 加 乘 检查成员
  • yolact模型测试(一)

    YOLACT时2019新出的用于实例分割的深度学习模型 在一番环境配置后成功复现了yolact 针对改进版的YOLACT 我还未尝试 下面简单的测试了yolact模型中对mask的处理 当然限于时间精力的有限 本文是针对一个博主的一篇文章
  • Hibernate之@Id详解

    给实体的一个属性标识为数据库表中的主键时 可以使用 Id public class Student private Integer id Id public Integer getId return id public void setId
  • Android studio中Custom View使用方法

    Android studio的好处 这里就不错过多的说明了 studio中内置了很多的模版可供使用 大大的简化了工作量 在实际开发中 android自带的各类控件可能无法满足我们的需求 这就需要我们自定义控件 下面介绍一下Custom Vi
  • google 浏览器出现 ERR_PROXY_CONNECTION_FAILED 无法访问网络

    1 问题 早上来公司突然发现谷歌浏览器访问所有的东西都出现 ERR PROXY CONNECTION FAILED 网络不可用的提示 这一串的单词的意思是 代理连接失败 真的是一脸懵逼 经过一番百度后发现是网络代理作的妖 2 解决方法 其实
  • 安卓移动应用开发之从零开始写程序6

    实验六 记事本小项目的实现 一 由于项目相对来说比较中等 所以我分为两个实验来介绍给大家 本次实验实现最终效果图如下 实现除保存按钮外的按钮监听以及界面的布局文件 主界面 显示笔记的内容和编辑的时间 里面有一个添加按钮 添加笔记界面 返回按
  • The 19th Zhejiang Provincial Collegiate Programming Contest 2022浙江省赛 (A/B/C/G/L/I)

    https codeforces com gym 103687 题解在cf旁边的Tutorial那里 A JB Loves Math 本来是按照数的奇偶分类讨论 一直wa2 跑了个对拍 如果错了 可以考虑这几个样例 由于x y固定 所以只能
  • [数据库】sql 查询语句 汇总

    students表 id class id name gender score 1 1 小明 M 90 2 1 小红 F 95 class表 id name 1 一班 2 二班 3 三班 4 四班 1 基本查询 查询students表的所有
  • 解析阿里云分布式调度系统伏羲

    解析阿里云分布式调度系统伏羲 转载于 阿里云社区https yq aliyun com articles 72526 spm 5176 100240 searchblog 119 DjZ0I4 伏羲的系统架构如下图所示 整个集群包括一台Fu
  • 关于Nios II中Verify failed between address 0xxxx and

    Verifying 000xxxxx 0 Verify failed between address 0xxxxxx and 0xxxxxxLeaving target Processor paused 论坛和网络上关于这个问题问的特别多
  • ssh登录时提示「permission denied please try again」

    ssh使用root账号登录系统 提示permission denied please try again 可能导致该情况的几种原因 密码被改了 只能换其他账号登录 之后使用sudo命令执行 使用root还没打开 可以使用以下几步进行修改 使
  • Maven: Could not transfer artifact xxx from/to xxx

    1 美图 2 背景 遇到这个问题 Could not transfer artifact xxx from to xxx 暂时还没解决 解决后 会补上 Maven报错 Could not transfer artifact xxx from
  • float(“inf“)、float(“-inf“)

    一 python里如何表示正负无穷 正无穷 float inf 负无穷 float inf 二 用inf做简单加 乘算术运算会得到inf print 1 float inf inf print 2 float inf inf 三 除了inf
  • python线性表

    顺序表 顺序表 将元素顺序地存放在一块连续的存储区里 元素间的顺序关系由它们的存储顺序自然表示 数据元素本身连续存储 每个元素所占的存储单元大小固定相同 元素的下标是其逻辑地址 而元素存储的物理地址 实际内存地址 可以通过存储区的起始地址L
  • 山石网科国产化入侵防御系统,打造全生命周期的安全防护

    随着互联网的普及和网络安全的威胁日益增加 botnet感染成为了企业面临的重要问题之一 botnet是一种由分散的客户端 或肉鸡 组成的网络 这些客户端被植入了bot程序 受控于攻击者 攻击者通过这些客户端的bot程序 利用C C服务器对这
  • 指数分布的定义形式及应用

    转载请注明出处 http blog csdn net ningyaliuhebei article details 46409941 指数分布是连续型随机变量 指数分布具有无记忆性 指数分布是特殊的gamma分布 指数分布 Exponent
  • python主流web框架识别

    想学习web框架 又想熟悉python 问题来了 有没有极简的数据来支撑快速开发 特来研究 不能去研究几十个 没时间 研究主流的即可 Django Tornado Flask Twisted 所谓网络框架是指这样的一组Python包 它能够

随机推荐

  • 树组件根节点+叶节点渲染

    本人使用的是eleme的树组件进行的数据渲染 Element The world s most popular Vue UI frameworkElement 一套为开发者 设计师和产品经理准备的基于 Vue 2 0 的桌面端组件库http
  • 进阶题解:反转链表

    入门级题解 https blog csdn net m0 46663240 article details 122602996 一刷代码随想录 再次遇到这个反转链表 当时可是难到我了 现在做还是比较轻松的 思路及关键点 1 有两部分 一部分
  • ROS入门四 服务中的Server和Client

    服务中的Server和Client 简介 使用 spawn服务写一个客户端程序创建一只新海龟 服务模型 创建turtle spawn cpp 配置CMakeLists txt中的编译规则 编译并运行 总结流程 创建一个服务接受client消
  • 数学建模——仓内拣货优化问题

    仓内拣货优化问题 求解 某电商公司客户订单下达仓库后 商品开始下架出库 出库主要包含5 个流程如图1所示 定位 仓库有多个货架 每个货架有多个货格 商品摆放在货格中 且每个货格最多摆放一种商品 商品可以摆放在多个货格 订单下达仓库后 定位操
  • springboot有关type-aliases-package设置,xml别名爆红错误

    在application yaml中设置 mybatis mapperLocations classpath mapper xml type aliases package com chan springcloud entities 但xm
  • 【CSS】动态背景1

    效果 代码
  • 利用Vulnhub复现漏洞 - mini_httpd任意文件读取漏洞(CVE-2018-18778)

    mini httpd任意文件读取漏洞 CVE 2018 18778 Vulnhub官方复现教程 漏洞原理 复现过程 启动环境 端口设置 浏览器设置 BurpSuit设置 漏洞复现 Vulnhub官方复现教程 https vulhub org
  • 【目录贴】硕士实验室嵌入式学习路线参考清单

    下面是对我在硕士期间边学边实践所写的部分文章 挑选整理出一个 学习清单 其实我写到目前为止 如果你看进去了这些东西 可以说各种东西达到了熟悉 熟练的状态 可不敢说精通 面试官会出手 如果看到这篇路线总结 无论你是本科还是硕士 你也别太感觉东
  • TCP的半关闭状态以及tcp-keepalive

    文章目录 半关闭状态 实现方法 tcp keepalive 开启 tcp keepalive 方法1 Linux系统全局开启 方法2 setsockopt 设置 socket 半关闭状态 一次TCP四次挥手的过程如上图所示 设左侧为客户端
  • elasticsearch 去重查询并进行分页

    去重查询的俩种方式 在进行去重查询时 原来的目的是对于查询出的结果中一模一样的数据进行去重 但是各种百度发现都是对于单一字段的去重查询 最后索性新增了一个字段 将其他字段拼接了起来 从而根据拼接的字段进行去重查询 1 使用字段聚合 top
  • windows:windows10 下如何让程序被 Cortana搜索到

    参考 https blog csdn net qq 26462567 article details 101011871 总结 添加快捷方式到开始菜单目录
  • 测试框架pytest教程(5)运行失败用例-rerun failed tests

    content of test 50 py import pytest pytest mark parametrize i range 50 def test num i if i in 17 25 pytest fail bad luck
  • 八度音阶和频率的关

    八度音阶和频率的关系 Frequency in hertz semitones above or below middle C Octave Note 0 1 2 3 4 5 6 7 8 9 C 16 352 48 32 703 36 65
  • Qt 常用的字符转换,QString如何转换成const char类型, 转 PWCHAR wchar_t*

    常用的字符转换 日常记录 QString如何转换成const char类型 const char cmd data qstring toStdString c str qstring为待转换的qstring类型字符串 QString for
  • redis主从复制和哨兵模式

    redisi主从和哨兵模式 主从复制概扩及原理 redisi主从复制模式 redis哨兵原理 redis哨兵模式 主从复制概扩及原理 Redis主从复制是指将一个Redis实例 即主库 的数据复制到其他Redis实例 即从库 的过程 主节点
  • 一分钟了解HTTP和HTTPS协议

    很多人存在这样的疑惑就是http与https的区别 这篇文章就跟大家介绍一下 一句话总结HTTPS是身披SSL外壳的HTTP HTTPS更安全 实际使用中绝大多数的网站现在都采用的是HTTPS协议 这也是未来互联网发展的趋势 什么是协议 网
  • vue+elementui封装select-tree下拉树【单选

    组件代码
  • 鸟类识别扫一扫,AI识鸟一拍就知道鸟类信息

    随着工业化的发展 森林 湿地等生态系统逐步被开发 如何保护鸟类日益成为人们关注的话题 针对自然保护地鸟类监测面临的种类繁多 相似度高 活动范围大等痛点 快瞳科技研发上线的鸟类识别算法便致力于解决以上痛点 借助AI赋能助力生物多样性保护 快瞳
  • Linux命令之杀掉被占用的端口号

    前言 场景介绍 项目启动失败或者启动成功访问报404 很可能是访问端口被占用导致 记录一下杀死被占用端口的常用命令 共同学习 实现过程 方案1 查找被占用的端口号 netstat tln grep 8081 netstat anp grep
  • 关于Python中的可变对象与不可变对象的区别

    Python中的可变对象与不可变对象 什么是可变对象 不可变对象 可变对象 对象存放在地址中的值不会被改变 所谓的改变是创建了一块新的地址并把新的对象的值放在新地址中原来的对象并没有发生变化 不可变对象 对象存放在地址中的值会原地改变 in