Python字典的key类型是有限制的,简单来说key的类型必须是不可变对象,如字符串、数字、元组等,不能是可变对象,如列表、集合、字典等可变对象。
原因是:Python中字典使用哈希表来实现,在创建字典时,对于每一个key会根据哈希算法计算出一个哈希值,通过哈希值来进行快速定位和查找,从而提高字典的访问效率。而可变对象是可以修改的,一旦被修改之后哈希值就会发生变化,从而破坏了哈希表的特性,导致字典无法正常工作。
以下是两个示例说明:
- 例1:使用字符串作为key
# 创建一个字典,key为字符串类型
person = {'name': 'Tom', 'age': 25, 'gender': 'Male'}
# 输出字典内容
print(person)
# 输出每一个键值对
for key, value in person.items():
print(key, value)
输出结果为:
{'name': 'Tom', 'age': 25, 'gender': 'Male'}
name Tom
age 25
gender Male
可以看出,使用字符串作为key是完全没有问题的,我们可以正常读取key对应的value。
- 例2:使用列表作为key
# 创建一个字典,key为列表
person_list = {['name', 'age', 'gender']: ['Tom', 25, 'Male']}
# 输出字典内容
print(person_list)
# 输出每一个键值对
for key, value in person_list.items():
print(key, value)
输出结果为:
TypeError: unhashable type: 'list'
由于列表是可变对象,不能作为字典的key,所以我们得到了TypeError异常。如果非要使用列表作为key,可以考虑使用元组,元组是不可变对象,可以作为字典的key,示例如下:
# 创建一个字典,key为元组类型
person_tuple = {('name', 'age', 'gender'): ['Tom', 25, 'Male']}
# 输出字典内容
print(person_tuple)
# 输出每一个键值对
for key, value in person_tuple.items():
print(key, value)
输出结果为:
{('name', 'age', 'gender'): ['Tom', 25, 'Male']}
('name', 'age', 'gender') ['Tom', 25, 'Male']
通过使用元组作为key,可以正常读取key对应的value。