在日常的学习和工作中,经常会遇到不可变对象的问题,但是随着接触python这门语言的时间越来越多,遇到的坑越来越奇怪。我不禁产生了一个疑问:不可变对象真的不可变吗?
我们知道元组就是不可变对象,当你想尝试给一个元组赋值的时候,它会报错:
请注意报错的语言: does not support item** assignment** , 元组对象不支持赋值操作。
例1让我们来看看下面这样的操作:
尽管报了一个错,但是它变量的值已经被改变了。
原因其实,这里主要是因为 += 操作对于“不可变对象”会产生新的变量并绑定到原有变量上。但是又由于+=中的=号,执行了一次对元组对象的赋值操作,这是不允许的,因此报了错,但新的对象已经被绑定到了原有变量中,因此我们可以看到变量的值发生了改变。
例2还有一种情况是这样的:
这里完全没有报错,为什么呢?因为append并不涉及到赋值操作,元组只是不允许赋值,并没有不允许append和extend啊,所以称元组为“不可变对象” 实在是太不严谨了!
深一点
其实如果你知道元组中存放的是元素所对应的地址(id),就好理解多了,append和extend仅仅是修改了列表的元素,而列表本身的id并没有发生变化,只有当赋值操作执行的时候,id才会发生变化,而这种情况是元组不允许发生的。
因此,要避免踩上这些坑,忘掉元组是“不可变对象”这样不严谨的表述形式(当然从地址的角度来讲它是对的,元组内部所有元素的id都不可变),请这样记: 元组是不可赋值对象 。
DoIP介绍 DoIP应用场景
众芯片商争出头 大陆低价机硝烟弥漫
首例国行爆炸Note7检测报告出炉!三星让人愤怒
基于Zigbee技术的室内照明系统设计研究
第四代核电蓄势待发
Python 不可变对象真的不可变吗
三十而立的Cadence与IC产业携手向前
基于多场景化解决方案,华为云助力制造业企业走出数字化转型困境
红米Note 7采用了双面2.5D玻璃设计并搭载骁龙660处理器
喜报 | 11届双创大赛层层角逐,英码科技勇创佳绩荣获“优胜奖”!
匈牙利沃达丰将于10月17日开通其首批5G网络
腾讯黑鲨游戏手机3全网预约量突破500万 将于3月6日正式开售
氮氧化物检测仪如何检测?
佳能EOS M6相机,拥有约2420万有效像素,最高连拍速度约为9张/秒
艾默生EC20系列PLC在空压机联控中的应用
【虹科Pico示波器】数学通道的应用(三)—ABS传感器计算车速
一加Concept One首款概念机曝光采用了迈凯伦经典的潜隐式后摄设计
英伟达GeForce RTX显卡性能比下一代游戏主机还强?
高压功率放大器在环境监测中的应用
省电干货篇:有那些说起来高大上的省电技术呢?