可变与不可变类型
python中的数据类型根据底层内存机制分为可变与不可变两种。
id()
内建函数id()
返回值的内存地址。
>>> a = 1
>>> id(a)
4382612480
这里的内存地址是解释器里转换成十进制整数的虚拟地址。
可变类型
可变数据类型的数据实例,也称为可变对象。可变对象可以在其id()
保持固定不变的情况下改变其取值。
下面的列表,修改值后,id保持不变
>>> ls = [1,2,3]
>>> id(ls)
140453670614592
>>> ls[0] = 'a'
>>> print(ls)
['a', 2, 3]
>>> id(ls)
140453670614592
基本数据类型中,列表,集合,字典都是可变数据类型。
不可变类型
如果修改一个对象的值,必须创建新的对象,那么这个对象就是不可变对象。基本数据类型中,数字,字符串,元组是不可变类型。
例如下面的字符串,修改内容后id发生了改变,也即是创建了新的对象。
>>> s = 'hello'
>>> id(s)
140453671058032
>>> s = 'Hello'
>>> id(s)
140453671057264
不可变类型在需要常量哈希值地方起着重要的作用。
可哈希对象
python中一个对象的哈希值如果在其生命周期内绝不改变,就被称为可哈希。
可哈希对象都可以通过内置函数hash
进行求值。因为底层计算的原因,可以通过是否可哈希判断对象是否可变。
凡是可哈希的对象都是不可变对象,凡是不可哈希的对象都是可变对象。
>>> hash(1)
1
>>> hash('a')
8371404579657727211
>>> hash([1,2])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'