可变与不可变类型

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'
posted @ 2022-08-19 17:36  python心蓝  阅读(172)  评论(0编辑  收藏  举报