python元組的可變與不可變問題
python元組的可變與不可變
學(xué)過python的人都知道有一種數(shù)據(jù)類型叫做元組,而元組與列表最重要的區(qū)別就在于元組一經(jīng)定義就不能改變其內(nèi)容,但元組中的內(nèi)容真的是完全不可變的嗎,看了下面這段代碼想必你也會產(chǎn)生這樣的疑問.
代碼如下:
tuple = (1, 2, 3, [1, 4, 7]) print(tuple) tuple[3][2] = 100 print(tuple)
在編譯器上運行上述代碼,結(jié)果如下:

從結(jié)果來看,元組中數(shù)據(jù)已經(jīng)產(chǎn)生了變化,那元組還是不可變的嗎,我們下面就從內(nèi)存來解釋元組的可變與不可變.

上面的圖就是內(nèi)存圖,元組和列表都是引用數(shù)據(jù)類型,其內(nèi)存空間存放的元素存放位置的地址值,所謂元組的不可變指的是元組所指向的內(nèi)存中的內(nèi)同不可變,在上圖中體現(xiàn)的是1,2,3和0x200這四個值不可變,而對于0x200這個地址所指向的列表來說,其內(nèi)容是可以改變的.
為什么元組Tuple是不可變的,列表List是可變的
1.所謂元組的不可變指的是元組所指向的內(nèi)存中的內(nèi)容不可變
# 關(guān)于元組是不可變的 tupleA = (1, 2, 3, 4) # tupleA[0] = 0 ?# 報錯 TypeError: 'tuple' object does not support item assignment 不支持修改元素 # 查看內(nèi)存地址 id() print(id(tupleA)) tupleA = (1, 2, 3, 4) print(id(tupleA)) tupleA = (0, 1, 2, 3) print(id(tupleA))
輸出結(jié)果是:
1960670738208
1960670738208
1960670737888
從以上實例可以看出,重新賦值的元組 tupleA,綁定到新的對象了,不是修改了原來的對象。
2.List 是可變的
#關(guān)于List是可變的 listA = [1, 2, 3] print(id(listA)) listA[0] = 0 print(listA) print(id(listA)) listA = [1, 2, 3] print(id(listA)) listA = [1, 2, 4] print(id(listA))
輸出結(jié)果是
2974141229248
[0, 2, 3]
2974141229248
2974141227968
2974141229248
從以上實例可以看出,重新賦值的列表listA,并未綁定到新的對象,而是修改了原來的對象。
- 字典中的 key 必須是不可變的類型
- int str tuple 是值類型 (是不可變的)
- List set dict 是引用類型(是可變的)
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
3行Python代碼實現(xiàn)圖像照片摳圖和換底色的方法
這篇文章主要介紹了3行Python代碼實現(xiàn)圖像照片摳圖和換底色的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS淺析
這篇文章主要給大家介紹了關(guān)于Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧2018-05-05
解決python文件字符串轉(zhuǎn)列表時遇到空行的問題
下面小編就為大家?guī)硪黄鉀Qpython文件字符串轉(zhuǎn)列表時遇到空行的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07

