我最近在Python中尝试了以下命令:
>>> {lambda x: 1: 'a'}
{<function __main__.<lambda>>: 'a'}
>>> def p(x): return 1
>>> {p: 'a'}
{<function __main__.p>: 'a'}
双方的成功dict
Creations 表明 lambda 函数和常规函数都是可哈希的。 (就像是{[]: 'a'}
失败了TypeError: unhashable type: 'list'
).
哈希值显然不一定是函数的 ID:
>>> m = lambda x: 1
>>> id(m)
140643045241584
>>> hash(m)
8790190327599
>>> m.__hash__()
8790190327599
最后一条命令显示__hash__
方法明确定义为lambda
s,也就是说,这不是 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(使用前将#替换为@)