为什么字典查找触发'unhashable type'错误但直接传入硬编码值正常?
报错原因
你遇到的核心问题是两个看起来值相同的对象,实际类型完全不同:
- 硬编码写入的
(255, 0, 0, 255)是Python原生元组(tuple),属于不可变类型,满足字典键的可哈希要求。 pygame.Surface.get_at()返回的是pygame.Color类的实例,并非元组。该类的实例在多数pygame版本中被定义为不可哈希,直接作为字典键就会触发unhashable type错误。
你看到的打印结果一致,是因为pygame.Color重写了字符串转换方法,打印时会输出和RGBA元组完全相同的格式,只是视觉上和元组一致,本质类型完全不同。你可以添加一行代码验证类型差异:
print(type(colour_under_mouse)) # 输出结果为 <class 'pygame.Color'>,而非 <class 'tuple'>
解决方法
只需要将拿到的pygame.Color实例显式转换为元组,再作为字典的键查询即可:
colour_under_mouse = pygame.Surface.get_at(screen, mouse_pos) colour_selected = d_colours[tuple(colour_under_mouse)]
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

