什么是不可變類型?
存儲空間保存的數據不允許被修改,這種數據就是不可變類型。
常見的不可變類型有:
- 數字類型 int, bool, float, complex, long(2.x)
- 字符串 str
- 元組 tuple
什么是可變類型?
存儲空間保存的數據允許被修改,這種數據就是可變類型。
常見的可變類型有:
- 列表 list
- 字典 dict
***需要注意,可變類型通過方便改變數據才是修改內存中的數據,使用賦值”=”號並不是修改內存中的數據,而是開辟出一塊新的空間來存放新的數據。
兩個實例:
1 demo_list = [1, 2, 3] 2 3 print("定義列表后的內存地址 %d" % id(demo_list)) 4 5 demo_list.append(999) 6 demo_list.pop(0) 7 demo_list.remove(2) 8 demo_list[0] = 10 9 10 print("修改數據后的內存地址 %d" % id(demo_list)) 11 12 demo_dict = {"name": "小明"} 13 14 print("定義字典后的內存地址 %d" % id(demo_dict)) 15 16 demo_dict["age"] = 18 17 demo_dict.pop("name") 18 demo_dict["name"] = "老王" 19 20 print("修改數據后的內存地址 %d" % id(demo_dict))
輸出結果:
定義列表后的內存地址 2574756635272
修改數據后的內存地址 2574756635272
定義字典后的內存地址 2574760169336
修改數據后的內存地址 2574760169336
*可見通過方法來修改的字典或者列表,其內存地址是不變了,也說明了字典列表是可變的。
1 a = 1 2 print(id(a)) 3 a = "hello" 4 print(id(a)) 5 a = [1, 2, 3] 6 print(id(a)) 7 a = [3, 2, 1] 8 print(id(a))
輸出結果:
140714386514768
2214895252792
2214894789256
2214894789320
*說明‘=‘賦值運算符是重新為變量指向一個新的內存地址,而不是修改原來內存的數據,注意與上例區別好。
字典的key與哈希
字典的鍵必須是不可變類型數據,而值則可以是任意類型的數據。
這是因為不可變類型的數據才會有哈希值,而字典的鍵必須要有對應的哈希值。
Python中有一個內置函數hash(o)可以接受一個不可變類型數據作為參數,返回一個整數,這個整數可以看成是該數據的特征碼,因此,相同的數據內容得到相同的整數,而不同的數據內容則得到不同的整數。
另外,由於列表是不可哈希類型的,因此決定了它的有序性,可重復性。
由於字典、集合是可哈希類型的,因此具有不可重復,無序性。