Python 函数为何以及如何可哈希?

2023-12-31

我最近在Python中尝试了以下命令:

>>> {lambda x: 1: 'a'}
{<function __main__.<lambda>>: 'a'}

>>> def p(x): return 1
>>> {p: 'a'}
{<function __main__.p>: 'a'}

双方的成功dictCreations 表明 lambda 函数和常规函数都是可哈希的。 (就像是{[]: 'a'}失败了TypeError: unhashable type: 'list').

哈希值显然不一定是函数的 ID:

>>> m = lambda x: 1
>>> id(m)
140643045241584
>>> hash(m)
8790190327599
>>> m.__hash__()
8790190327599

最后一条命令显示__hash__方法明确定义为lambdas,也就是说,这不是 Python 根据类型自动计算的东西。

使函数可哈希背后的动机是什么?另外,函数的哈希值是多少?


没什么特别的。正如你所看到的,如果你检查未绑定的__hash__函数类型的方法:

>>> def f(): pass
...
>>> type(f).__hash__
<slot wrapper '__hash__' of 'object' objects>

the of 'object' objects部分意味着它只是继承默认的基于身份的__hash__ from object。功能== and hash通过身份工作。和...之间的不同id and hash对于任何继承的类型来说都是正常的object.__hash__:

>>> x = object()
>>> id(x)
40145072L
>>> hash(x)
2509067

你可能认为__hash__应该只为不可变对象定义,你几乎是对的,但是缺少一个关键细节。__hash__应该只为对象定义所涉及的一切==比较是不可变的。对于对象,其==是基于身份的,这是完全标准的基础hash身份也是如此,因为即使对象是可变的,它们也不可能以改变其身份的方式可变。文件、模块和其他基于身份的可变对象==所有人都这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 函数为何以及如何可哈希? 的相关文章

随机推荐