Jas*_*ker 5 python hash inheritance dictionary class
例如,假设我这样做:
>>> class foo(object):
... pass
...
>>> class bar(foo):
... pass
...
>>> some_dict = { foo : 'foo',
... bar : 'bar'}
>>>
>>> some_dict[bar]
'bar'
>>> some_dict[foo]
'foo'
>>> hash(bar)
165007700
>>> id(bar)
165007700
Run Code Online (Sandbox Code Playgroud)
基于此,看起来该类正在作为其id号进行哈希处理.因此,如果我改变了类,那么不应该担心bar
散列是否为a foo
或a bar
或散列值.
这种行为是否可靠,或者这里有任何问题吗?
是的,任何未实现__hash__()
函数的对象都将在哈希时返回其id.从Python语言参考:数据模型 - 基本定制:
用户定义的类默认具有
__cmp__()
和__hash__()
方法; 与它们一起,所有对象都比较不等(除了自己)和x.__hash__()
返回id(x)
.
但是,如果您希望拥有唯一标识符,请使用id
以明确您的意图.对象的哈希应该是其组件的哈希的组合.有关详细信息,请参阅上面的链接.
类有默认的实现__eq__
,并__hash__
在使用id()
作出了比较,并分别计算哈希值.也就是说,他们按身份进行比较.实现__hash__
方法的主要规则是,如果两个对象相互比较相等,则它们也必须具有相同的哈希值.散列值可以看作是dicts和sets使用的优化,可以更快地找到相等的对象.因此,如果您更改__eq__
为执行不同类型的相等性测试,则还必须更改__hash__
实现以同意该选择.
使用身份进行比较的类可以自由地变异并在dicts和sets中使用,因为它们的身份永远不会改变.实现__eq__
按值进行比较并允许其值变异的类不能在散列集合中使用.