为啥字典查找会导致“不可散列类型”错误,但使用直接值不会?

Posted

技术标签:

【中文标题】为啥字典查找会导致“不可散列类型”错误,但使用直接值不会?【英文标题】:Why is Dictionary lookup causing 'unhashable type' error, but using direct values doesn't?为什么字典查找会导致“不可散列类型”错误,但使用直接值不会? 【发布时间】:2021-12-16 18:47:09 【问题描述】:

我正在尝试使用字典查找来改进一些代码,而不是使用繁琐的多个 if 语句。但是,当我尝试使用派生的变量运行代码时,代码会返回“TypeError: unhashable type”,但如果我运行相同的代码但使用直接值而不是派生值,则代码会运行。

这是失败的代码:

def colour_check_under_mouse():
 global d_colours
 mouse_pos = pygame.mouse.get_pos()
 if pygame.mouse.get_pressed()[0]:
    colour_under_mouse = pygame.Surface.get_at(screen, mouse_pos)
    print(colour_under_mouse)
    colour_selected = d_colours[colour_under_mouse]
    # colour_selected = d_colours[255, 0, 0, 255]
    print(colour_selected)

在将注释掉的行替换为带有硬编码值的行之后,运行的代码如下:

def colour_check_under_mouse():
 global d_colours
 mouse_pos = pygame.mouse.get_pos()
 if pygame.mouse.get_pressed()[0]:
    colour_under_mouse = pygame.Surface.get_at(screen, mouse_pos)
    print(colour_under_mouse)
    # colour_selected = d_colours[colour_under_mouse]
    colour_selected = d_colours[255, 0, 0, 255]
    print(colour_selected)

使用的字典是:

d_colours = (255, 0, 0, 255): 'Red', (0, 255, 0, 255): 'Green', (0, 0, 255, 255): 'Blue', (255, 255, 0, 255): 'Yellow'

当我在 colour_selected = 行中硬编码与上面代码中返回的值完全相同的值时,我对为什么代码运行成功感到困惑。我了解什么是不可散列的类型,但是有人可以帮助我了解两行中发生了什么变化,导致一行导致该错误。干杯。

【问题讨论】:

【参考方案1】:

根据我在 PyGame (link) 文档中看到的内容,您正在使用的部分代码:

pygame.Surface.get_at

返回颜色而不是元组。尝试使用:

colour_under_mouse = tuple(pygame.Surface.get_at(screen, mouse_pos))

【讨论】:

以上是关于为啥字典查找会导致“不可散列类型”错误,但使用直接值不会?的主要内容,如果未能解决你的问题,请参考以下文章

类型错误:不可散列类型:'sl​​ice' [python] [dictionaries]

为啥 const int main = 195 会导致程序正常工作,但没有 const 会导致分段错误?

为啥实习全局字符串值会导致每个多处理进程使用更少的内存?

为啥使用 `cblas_ccopy` 会导致间歇性内存错误?

为啥初始化列表中的元素数量会导致模棱两可的调用错误?

为啥解包元组会导致语法错误?