可变、不可变的数据类型和hash
可变与不可变类型
在python中,我们对数据类型还有另外一种分类方式,我们给数据类型分为可变数据类型和不可变数据类型。在了解原理之前,我们先来看看分类情况:
| 可变类型 | 不可变类型 |
| 列表 | 数字 |
| 字符串 | |
|
元组 |
列表
>>> l = [1, 2, 3, 4] >>> id(l) 1619162612424 >>> l[1] = 1.5 >>> id(l) 1619162612424 >>>
数字
>>> a = 1 >>> id(a) 1378774032 >>> a+=1 >>> id(a) 1378774064
从内存角度看列表与数字的变与不变
字符串
# 例1 >>> s = 'hello' >>> s[1] = 'a' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment >>> # 例2 >>> s = 'hello' >>> id(s) 1619162599128 >>> s += ' world' >>> s 'hello world' >>> id(s) 1619162625648 >>>
字符串也可以像列表一样使用索引操作,但是通过上例可以看出,我们不能像修改列表一样修改一个字符串的值,当我们对字符串进行拼接的时候,原理和整数一样,id值已经发生了变化,相当于变成了另外一个字符串。
元组---不允许修改
>>> t = (1, 2, 3, 4) >>> t[1] = 1.5 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
hash
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入空间,不同的输入可能会散裂成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
特征:
hash值的计算过程是依据这个值的一些特征计算的,这就要求被hash的值必须固定,因此被hash的值必须是不可变的
用途:
- 文件签名
- MD5加密
- 密码验证
可以被hash的内容
hash值的计算过程是依据这个值的一些特征计算的,这就要求被hash的值必须固定。
可以想见如果“王老五”变成“王老六”了,计算的结果就会发生改变。
因此我们要说,坏消息是可变的数据类型是不可以被hash的,好消息是如果一个值可以hash那么说明这是一个不可变得数据类型。
不会用hash没有关系,这里你先知道什么是hash,接下来,我们要学习一种很厉害的数据类型,它就是用这种方式,让我们能够从大量数据中直接快速找到我们想要的数据。


浙公网安备 33010602011771号