0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python 不可变对象真的不可变吗

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-11-03 11:48 次阅读

在日常的学习和工作中,经常会遇到"不可变对象"的问题,但是随着接触Python这门语言的时间越来越多,遇到的坑越来越奇怪。我不禁产生了一个疑问:不可变对象真的不可变吗?

我们知道元组就是"不可变对象",当你想尝试给一个元组赋值的时候,它会报错:

图片

请注意报错的语言: "does not support item** assignment** ", 元组对象不支持赋值操作。

例1

让我们来看看下面这样的操作:

图片

尽管报了一个错,但是它变量的值已经被改变了。

原因

其实,这里主要是因为 += 操作对于“不可变对象”会产生新的变量并绑定到原有变量上。但是又由于+=中的"="号,执行了一次对元组对象的赋值操作,这是不允许的,因此报了错,但新的对象已经被绑定到了原有变量中,因此我们可以看到变量的值发生了改变。

例2

还有一种情况是这样的:

图片

这里完全没有报错,为什么呢?因为append并不涉及到赋值操作,元组只是不允许赋值,并没有不允许append和extend啊,所以称元组为“不可变对象” 实在是太不严谨了!

深一点

其实如果你知道元组中存放的是元素所对应的地址(ID),就好理解多了,append和extend仅仅是修改了列表的元素,而列表本身的ID并没有发生变化,只有当赋值操作执行的时候,ID才会发生变化,而这种情况是元组不允许发生的。

图片

因此,要避免踩上这些坑,忘掉元组是“不可变对象”这样不严谨的表述形式(当然从地址的角度来讲它是对的,元组内部所有元素的ID都不可变),请这样记: 元组是不可赋值对象

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28366
  • python
    +关注

    关注

    56

    文章

    4796

    浏览量

    84670
收藏 人收藏

    评论

    相关推荐

    #Python3教程 区分可变不可变对象

    编程语言python
    电子技术那些事儿
    发布于 :2022年08月29日 21:24:39

    [8.4.2]--8.4.2可变对象不可变对象

    python
    jf_75936199
    发布于 :2023年03月13日 17:21:38

    Python语言基础:可变类型与不可变类型(1)#Python语言基础

    编程语言python
    学习电子
    发布于 :2023年04月06日 16:08:55

    Python语言基础:可变类型与不可变类型(2)#Python语言基础

    编程语言python
    学习电子
    发布于 :2023年04月06日 16:10:16

    201. Python函数提高:13.19 可变不可变类型

    python
    充八万
    发布于 :2023年07月11日 20:04:12

    Python中的列表:可变性,实用程序和可访问性

    does not support item assignment  因此,即使将不可变对象存储在列表中,python也不会更改对象的属性。  列表可以具有任何数据类型作为其成员,无
    发表于 08-12 18:03

    ExaGrid荣获“年度企业备份硬件供应商”和“年度不可变存储公司”两项大奖

    超大型系统。ExaGrid提供唯一具有非面向网络的层级、延迟删除功能以及不可变对象以从勒索软件攻击中恢复的双层备份存储方案,因此我们特别荣幸地获得了‘年度不可变存储公司’奖。”ExaGrid分层备份存储
    发表于 10-14 12:04

    输出电压可变的高精度基准电源电路

    (特征:高精度、电压可变)类似REF-02C属于高精度、输出电压不可变的基
    发表于 05-13 09:10 1245次阅读
    输出电压<b class='flag-5'>可变</b>的高精度基准电源电路

    java中string不可变的原因

    区分对象对象的引用 对于Java初学者, 对于String是不可变对象总是存有疑惑。看下面代码: String s = ABCabc;System .out.println( s =
    发表于 09-27 13:24 0次下载
    java中string<b class='flag-5'>不可变</b>的原因

    什么是不可变对象 不可变对象存储可以抵御哪些威胁

    什么是不可变对象? 属性变更时必须新建对象对象,如String,已有“String str=‘abc’”,再次赋值“str=‘efg’”,此时新建一个String
    的头像 发表于 09-19 11:44 2565次阅读

    Linux发行版新秀:基于Ubuntu、系统核心 “不可变

    不可变的操作系统,系统的核心部分已被锁定,以防止第三方应用程序进行不必要的更改和损坏,或引起错误更新。
    的头像 发表于 01-11 15:35 1104次阅读

    python的深入使用

    可变对象是指,一个对象在不改变其引用的前提下,可以修改其所指向的地址中的值* 不可变对象是指,一个对象
    的头像 发表于 02-16 15:49 531次阅读
    <b class='flag-5'>python</b>的深入使用

    python字符串序列操作和不可变

    初识python字符串序列操作和不可变性。python字符串序列操作为序列通用操作,python字符串不可变性是对字符串的操作不会改变原始字
    的头像 发表于 02-23 15:01 864次阅读

    Python字典组成的数组如何进行去重?

    因为使用set去重的前提是该对象不可变对象,而字典是可变对象,因此无法直接使用该方法去重。
    的头像 发表于 02-24 13:58 888次阅读
    <b class='flag-5'>Python</b>字典组成的数组如何进行去重?

    python中tuple的用法

    Python中的元组(tuple)是一种不可变的有序集合。与列表(list)类似,元组可以存储任意类型的数据,但是元组一旦创建就不能被修改。在Python中,元组是使用圆括号进行表示,其中的元素可以
    的头像 发表于 11-21 16:27 977次阅读