在日常的學(xué)習(xí)和工作中,經(jīng)常會(huì)遇到"不可變對(duì)象"的問(wèn)題,但是隨著接觸Python這門語(yǔ)言的時(shí)間越來(lái)越多,遇到的坑越來(lái)越奇怪。我不禁產(chǎn)生了一個(gè)疑問(wèn):不可變對(duì)象真的不可變嗎?
我們知道元組就是"不可變對(duì)象",當(dāng)你想嘗試給一個(gè)元組賦值的時(shí)候,它會(huì)報(bào)錯(cuò):
請(qǐng)注意報(bào)錯(cuò)的語(yǔ)言: "does not support item** assignment** ", 元組對(duì)象不支持賦值操作。
例1
讓我們來(lái)看看下面這樣的操作:
盡管報(bào)了一個(gè)錯(cuò),但是它變量的值已經(jīng)被改變了。
原因
其實(shí),這里主要是因?yàn)?+= 操作對(duì)于“不可變對(duì)象”會(huì)產(chǎn)生新的變量并綁定到原有變量上。但是又由于+=中的"="號(hào),執(zhí)行了一次對(duì)元組對(duì)象的賦值操作,這是不允許的,因此報(bào)了錯(cuò),但新的對(duì)象已經(jīng)被綁定到了原有變量中,因此我們可以看到變量的值發(fā)生了改變。
例2
還有一種情況是這樣的:
這里完全沒有報(bào)錯(cuò),為什么呢?因?yàn)閍ppend并不涉及到賦值操作,元組只是不允許賦值,并沒有不允許append和extend啊,所以稱元組為“不可變對(duì)象” 實(shí)在是太不嚴(yán)謹(jǐn)了!
深一點(diǎn)
其實(shí)如果你知道元組中存放的是元素所對(duì)應(yīng)的地址(ID),就好理解多了,append和extend僅僅是修改了列表的元素,而列表本身的ID并沒有發(fā)生變化,只有當(dāng)賦值操作執(zhí)行的時(shí)候,ID才會(huì)發(fā)生變化,而這種情況是元組不允許發(fā)生的。
因此,要避免踩上這些坑,忘掉元組是“不可變對(duì)象”這樣不嚴(yán)謹(jǐn)?shù)谋硎鲂问剑ó?dāng)然從地址的角度來(lái)講它是對(duì)的,元組內(nèi)部所有元素的ID都不可變),請(qǐng)這樣記: 元組是不可賦值對(duì)象 。
-
變量
+關(guān)注
關(guān)注
0文章
614瀏覽量
28964 -
python
+關(guān)注
關(guān)注
56文章
4827瀏覽量
86769
發(fā)布評(píng)論請(qǐng)先 登錄



Python語(yǔ)言基礎(chǔ):可變類型與不可變類型(1)#Python語(yǔ)言基礎(chǔ)

Python語(yǔ)言基礎(chǔ):可變類型與不可變類型(2)#Python語(yǔ)言基礎(chǔ)

Python中的列表:可變性,實(shí)用程序和可訪問(wèn)性
ExaGrid榮獲“年度企業(yè)備份硬件供應(yīng)商”和“年度不可變存儲(chǔ)公司”兩項(xiàng)大獎(jiǎng)
java中string不可變的原因

什么是不可變對(duì)象 不可變對(duì)象存儲(chǔ)可以抵御哪些威脅
Linux發(fā)行版新秀:基于Ubuntu、系統(tǒng)核心 “不可變”
python字符串序列操作和不可變性
Python字典組成的數(shù)組如何進(jìn)行去重?

評(píng)論