哈希值 hash()
17.1 哈希值 hash()
哈希值是系统给固定不变的数据算出的一串唯一数字编号。
Python 靠哈希值快速判断两个值是否相等、存进集合/字典。
只有不可变数据才能算出稳定哈希值,叫「可哈希」;可变数据算不出固定哈希,叫「不可哈希」。
💡 能用 hash() 的数据才能存进集合和字典的键。
💡 列表、字典、集合本身不可哈希,但可以存放在集合中(元素本身是列表/字典不行)。
可哈希的类型
整数、字符串、元组都是可哈希的,同一数据哈希值固定不变。
print("整数 10 的哈希值:", hash(10))
print("字符串 'abc' 的哈希值:", hash("abc"))
print("元组 (1,2) 的哈希值:", hash((1, 2)))
print("多次调用 hash('hello'):", hash("hello"), hash("hello"))
print("hash('a'):", hash("a"))
print("hash('b'):", hash("b"))
不可哈希的类型
列表、字典、集合是可变类型,无法生成固定哈希值,调用 hash() 会报 TypeError。
try:
result = hash([1, 2]) # 列表无法哈希
print(result)
except TypeError as e:
print("列表 [1,2] 无法哈希:", e)
try:
result = hash({"a": 1}) # 字典无法哈希
print(result)
except TypeError as e:
print("字典 {'a':1} 无法哈希:", e)
print("原因:列表、字典、集合都是可变的,内容可能改变")
print("所以无法生成固定的哈希值")
⚠️ 常见错误与正确对比
❌ 错误写法
hash([1, 2, 3])
✅ 正确写法
hash((1, 2, 3))
📌 列表是可变的不可哈希,改用元组即可。
❌ 错误写法
s = {[1, 2], 3}✅ 正确写法
s = {(1, 2), 3}📌 集合只能存放可哈希的元素,列表不可哈希。
