创建字典对键的要求
创建字典有两种方法,创建时必须包含"键(key)"和"值(value)"两个项,键在左侧,值在右侧。字典中的值可以是 Python中 任何类型的对象。但是键必须满足下面三个条件才可以:
- 唯一性
字典中的每一个键都是唯一的,即不允许有重复的键。如果尝试为一个已存在的键设置新的值,原有的值会被新值替换。
- 不可变性
作为字典键的对象必须是不可变的,这意味着字符串(str)、数字(int、float 等)、元组(tuple,当元组内部元素也是不可变类型时)等不可变类型可以作为键,而列表(list)、字典或其他可变类型的对象则不能直接作为键。
- 哈希性
键必须是可哈希的 ,也就是说,Python 需要能通过键计算出一个哈希码,以便快速找到对应值的位置。Python 内置的不可变类型已经实现了__hash__()方法(即 hash(obj) 返回固定值),使得它们适合作为字典键。
问题:python元组一定可以做字典的键吗
元组作为字典键的规则
- 可以作为键 ✅
当元组的所有元素都是不可变且可哈希的(如 int、str、float、frozenset 等)。
python
d = { (1, 2, 3): "valid", ("a", "b"): "valid" }
print(d[(1, 2, 3)]) # 输出 "valid"
- 不能作为键 ❌
当元组内部包含可变对象(如 list、dict、set)。
python
key = (1, [2, 3]) # 元组内包含列表
d = { key: "invalid" } # TypeError: unhashable type: 'list'
判断元组是否可作为字典键
你可以使用 hash() 函数来测试:
python
print(hash((1, 2, 3))) # ✅ 可哈希,返回一个整数
print(hash((1, [2, 3]))) # ❌ 报错:TypeError: unhashable type: 'list'
结论
元组本身是不可变的,但如果其元素包含可变对象,则它不可哈希,无法作为字典键。