python中不可變資料型別和可變資料型別
在學習python過程中我們一定會遇到不可變資料型別和可變資料型別。
1.名詞解釋
以下所有的內容都是基於記憶體地址來說的。
不可變資料型別: 當該資料型別的對應變數的值發生了改變,那麼它對應的記憶體地址也會發生改變,對於這種資料型別,就稱不可變資料型別。
可變資料型別 :當該資料型別的對應變數的值發生了改變,那麼它對應的記憶體地址不發生改變,對於這種資料型別,就稱可變資料型別。
總結:不可變資料型別更改後地址發生改變,可變資料型別更改地址不發生改變
2.資料型別分類
在python中資料型別有:整型,字串,元組,集合,列表,字典。接下來我們用例子來一一檢視他們分別屬於不可變資料型別還是可變資料型別。
2.1 整型
a = 1 print(id(a),type(a)) a = 2 print(id(a),type(a)) 1912499232 <class 'int'> 1912499264 <class 'int'>View Code
我們可以發現,當資料發生改變後,變數的記憶體地址發生了改變,那麼整型就是不可變資料型別。
2.2 字串
b = 'djx' print(id(b),type(b)) b = 'djx1996' print(id(b),type(b)) 535056476344 <classView Code'str'> 535056476624 <class 'str'>
我們可以發現,當資料發生改變後,變數的記憶體地址發生了改變,那麼字串就是不可變資料型別。
2.3 元組
元組被稱為只讀列表,即資料可以被查詢,但不能被修改,但是我們可以在元組的元素中存放一個列表,通過更改列表的值來檢視元組是屬於可變還是不可變。
c1 = ['1','2'] c = (1,2,c1) print(c,id(c),type(c)) c1[1] = 'djx' print(c,id(c),type(c)) result: (1View Code, 2, ['1', '2']) 386030735432 <class 'tuple'> (1, 2, ['1', 'djx']) 386030735432 <class 'tuple'>
我們可以發現,雖然元組資料發生改變,但是記憶體地址沒有發生了改變,但是我們不可以以此來判定元組就是可變資料型別。我們回頭仔細想想元組的定義就是不可變的。我們修改了元組中列表的值,但是因為列表是可變資料型別,所以雖然在列表中更改了值,但是列表的地址沒有改變,列表在元組中的地址的值沒有改變,所以也就意味著元組沒有發生變化。我們就可以認為元組是不可變資料型別,因為元組是不可變的。
2.4 集合
集合我們常用來進行去重和關係運算,集合是無序的。
s = {1,'d','34','1',1} print(s,type(s),id(s)) s.add('djx') print(s,type(s),id(s)) result: {'d', 1, '34', '1'} <class 'set'> 870405285032 {1, '34', 'djx', '1', 'd'} <class 'set'> 870405285032View Code
我們可以發現,雖然集合資料發生改變,但是記憶體地址沒有發生了改變,那麼集合就是可變資料型別。
2.5 列表
列表是python中的基礎資料型別之一,其他語言中也有類似於列表的資料型別,比如js中叫陣列,它是以[]括起來,每個元素以逗號隔開,而且它裡面可以存放各種資料型別。
list = [1,'q','qwer',True] print(list,type(list),id(list)) list.append('djx') print(list,type(list),id(list)) result: [1, 'q', 'qwer', True] <class 'list'> 808140621128 [1, 'q', 'qwer', True, 'djx'] <class 'list'> 808140621128View Code
我們可以發現,雖然列表資料發生改變,但是記憶體地址沒有發生了改變,那麼列表就是可變資料型別。
2.6 字典
字典是python中唯一的對映型別,採用鍵值對(key-value)的形式儲存資料。python對key進行雜湊函式運算,根據計算的結果決定value的儲存地址,所以字典是無序儲存的。但是在3.6版本後,字典開始是有序的,這是新的版本特徵。
字典的key值可以是整型,字串,元組,但是不可以是列表,集合,字典。
tuple = (1) dic = {1:2} d = { tuple:1,'key2':'djx','key3':'li'} print(d,type(d),id(d)) d['key4'] = 'haha' print(d,type(d),id(d)) result: {1: 1, 'key2': 'djx', 'key3': 'li'} <class 'dict'> 256310956320 {1: 1, 'key2': 'djx', 'key3': 'li', 'key4': 'haha'} <class 'dict'> 256310956320View Code
我們可以發現,雖然字典資料發生改變,但是記憶體地址沒有發生了改變,那麼字典就是可變資料型別。
資料型別 | 可變/不可變 |
整型 | 不可變 |
字串 | 不可變 |
元組 | 不可變 |
列表 | 可變 |
集合 | 可變 |
字典 | 可變 |