在日常的學習和工作中,經常會遇到"不可變對象"的問題,但是隨著接觸Python這門語言的時間越來越多,遇到的坑越來越奇怪。我不禁產生了一個疑問:不可變對象真的不可變嗎?
我們知道元組就是"不可變對象",當你想嘗試給一個元組賦值的時候,它會報錯:
請注意報錯的語言: "does not support item** assignment** ", 元組對象不支持賦值操作。
例1
讓我們來看看下面這樣的操作:
盡管報了一個錯,但是它變量的值已經被改變了。
原因
其實,這里主要是因為 += 操作對于“不可變對象”會產生新的變量并綁定到原有變量上。但是又由于+=中的"="號,執行了一次對元組對象的賦值操作,這是不允許的,因此報了錯,但新的對象已經被綁定到了原有變量中,因此我們可以看到變量的值發生了改變。
例2
還有一種情況是這樣的:
這里完全沒有報錯,為什么呢?因為append并不涉及到賦值操作,元組只是不允許賦值,并沒有不允許append和extend啊,所以稱元組為“不可變對象” 實在是太不嚴謹了!
深一點
其實如果你知道元組中存放的是元素所對應的地址(ID),就好理解多了,append和extend僅僅是修改了列表的元素,而列表本身的ID并沒有發生變化,只有當賦值操作執行的時候,ID才會發生變化,而這種情況是元組不允許發生的。
因此,要避免踩上這些坑,忘掉元組是“不可變對象”這樣不嚴謹的表述形式(當然從地址的角度來講它是對的,元組內部所有元素的ID都不可變),請這樣記: 元組是不可賦值對象 。
-
變量
+關注
關注
0文章
613瀏覽量
28465 -
python
+關注
關注
56文章
4807瀏覽量
85037
發布評論請先 登錄
相關推薦
![](https://file.elecfans.com/web2/M00/66/60/pYYBAGMMssCAZMdTAAD2EnqjuAs627.jpg)
![](https://file1.elecfans.com/web2/M00/87/F9/wKgaomRmnjOAbDExAABbcXbKexA165.png)
![](https://file1.elecfans.com/web2/M00/88/16/wKgaomRmociAA75gAAJxvN3g9Iw970.png)
![](https://file1.elecfans.com/web2/M00/88/17/wKgZomRmocmAezHuAAF6H58IOsQ441.png)
![](https://file.elecfans.com/web2/M00/B0/D3/pYYBAGStRRmAVcKkAAAjQo2mtf8150.png)
Python中的列表:可變性,實用程序和可訪問性
ExaGrid榮獲“年度企業備份硬件供應商”和“年度不可變存儲公司”兩項大獎
java中string不可變的原因
![java中string<b class='flag-5'>不可變</b>的原因](https://file.elecfans.com/web2/M00/49/E0/pYYBAGKhvG6AKOAsAABh5HB-z8w091.png)
評論