2026-10-27 11:35:39
在Python中,字典的键(key)必须是不可变类型,这是由字典的哈希表实现机制决定的。以下是关于字典键类型的详细说明:
1. 允许作为字典键的类型不可变基本类型:
字符串(str):如 "name"。
数字(int、float):如 42 或 3.14(注意 1 和 1.0 的哈希值相同,可能冲突)。
布尔值(bool):本质是 int 的子类(True 对应 1,False 对应 0)。
不可变元组(tuple):仅当元组内所有元素均为不可变类型时才可用作键,例如 (1, "a") 是合法的,但 ([1],) 不合法。
其他不可变对象:
函数/方法:如 len 或自定义函数 def foo(): pass。
自定义类实例:若类实现了 __hash__ 方法且对象不可变(如重写 __setattr__ 防止属性修改)。
冻结集合(frozenset):不可变的集合类型。
列表(list):如 [1, 2],因其内容可修改。
字典(dict):如 {"a": 1},键本身不可哈希。
集合(set):如 {1, 2},可变性导致无法哈希。
包含可变对象的元组:如 ([1],),即使外层是元组,内部列表仍可变。
Python字典的键必须是不可变类型,核心判断标准是对象是否实现了不可变的 __hash__ 方法。常见合法键包括字符串、数字、不可变元组等,而列表、字典等可变类型则被禁止。理解这一规则有助于避免运行时错误并优化数据结构选择。