gpt4 book ai didi

python - 为什么我不能在不可散列实例的明显可散列方法上调用 hash()?

转载 作者:IT老高 更新时间:2023-10-28 22:21:19 28 4
gpt4 key购买 nike

假设我有一本字典:

>>> d = {}

它有一个方法clear():

>>> d.clear
<built-in method clear of dict object at 0x7f209051c988>

... 具有 __hash__ 属性:

>>> d.clear.__hash__
<method-wrapper '__hash__' of builtin_function_or_method object at 0x7f2090456288>

...这是可调用的:

>>> callable(d.clear.__hash__)
True

那为什么我不能散列呢?

>>> hash(d.clear)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'

注意:我知道 dict 对象是不可散列的——我很好奇为什么这个限制会扩展到它们的方法,尽管如上所述,它们出现否则 claim ?

最佳答案

它是一个绑定(bind)方法,绑定(bind)方法有一个对self的引用,例如词典。这使得该方法不可散列。

可以散列未绑定(bind)的 dict.clear 方法:

>>> d = {}
>>> d.clear.__self__
{}
>>> d.clear.__self__ is d
True
>>> hash(d.clear)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> hash(dict.clear)
-9223372036586189204

可散列的实例上的方法本身也是可散列的,因此内置绑定(bind)方法的对象类型实现了 __hash__ 方法,但会引发 TypeError__self__ 属性不可散列时。这与 object.__hash__ 方法文档一致;如果您可以将其设置为 None 或根本不实现它,那么这是可取的,但是对于仅在运行时才知道哈希性的情况,提高 TypeError 是唯一的选择可用。

关于python - 为什么我不能在不可散列实例的明显可散列方法上调用 hash()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29239128/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com