什么是不可变类型?
存储空间保存的数据不允许被修改,这种数据就是不可变类型。
常见的不可变类型有:
- 数字类型 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)可以接受一个不可变类型数据作为参数,返回一个整数,这个整数可以看成是该数据的特征码,因此,相同的数据内容得到相同的整数,而不同的数据内容则得到不同的整数。
另外,由于列表是不可哈希类型的,因此决定了它的有序性,可重复性。
由于字典、集合是可哈希类型的,因此具有不可重复,无序性。