Python 字典

创建字典对键的要求

创建字典有两种方法,创建时必须包含"键(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'

结论
元组本身是不可变的,但如果其元素包含可变对象,则它不可哈希,无法作为字典键。