gpt4 book ai didi

python - Python 函数为什么以及如何是可散列的?

转载 作者:IT老高 更新时间:2023-10-28 20:34:25 24 4
gpt4 key购买 nike

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

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

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

dict 的成功创建表明 lambda 和常规函数都是可散列的。 (类似 {[]: 'a'} 失败并出现 TypeError: unhashable type: 'list')。

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

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

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

使函数可散列化的动机是什么?作为奖励,函数的哈希是什么?

最佳答案

没什么特别的。如您所见,如果您检查函数类型的未绑定(bind) __hash__ 方法:

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

of 'object' objects 部分意味着它只是从 object 继承默认的基于身份的 __hash__==hash 函数按身份工作。 idhash 的区别对于任何继承 object.__hash__ 的类型都是正常的:

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

你可能认为 __hash__ 应该只为不可变对象(immutable对象)定义,你几乎是对的,但它缺少一个关键细节。 __hash__ 应该只为 == 比较中涉及的所有内容 不可变的对象定义。对于 == 基于身份的对象,将 hash 基于身份也是完全标准的,因为即使对象是可变的,它们也不可能是可变的在某种程度上会改变他们的身份。具有基于身份的 == 的文件、模块和其他可变对象都以这种方式运行。

关于python - Python 函数为什么以及如何是可散列的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38518849/

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