__hash__
像这样实施是个坏主意吗?
class XYZ:
def __init__(self):
self.val = None
def __hash__(self):
return id(self)
Run Code Online (Sandbox Code Playgroud)
我是否设置了一些潜在的灾难性的东西?
该__hash__
方法必须满足以下要求才能工作:
对于所有 x, y 使得x == y
,则hash(x) == hash(y)
。
在您的情况下,您的类没有实现__eq__
,这意味着x == y
当且仅当id(x) == id(y)
,因此您的哈希实现满足上述属性。
但是请注意,如果您确实实施了,__eq__
那么此实施可能会失败。
另外:拥有“有效”__hash__
和拥有良好的散列之间是有区别的。例如,以下是任何类的有效__hash__
定义:
def __hash__(self):
return 1
Run Code Online (Sandbox Code Playgroud)
一个好的散列应该尝试均匀分布对象,以尽可能避免冲突。通常这需要更复杂的定义。我会避免尝试提出公式,而是依赖 python 内置hash
函数。
例如,如果你的类有田a
,b
和c
那么我会使用这样的__hash__
:
def __hash__(self):
return hash((self.a, self.b, self.c))
Run Code Online (Sandbox Code Playgroud)
hash
for tuples的定义对于一般情况应该足够好。
最后:您不应该__hash__
在可变的类中定义(在用于相等的字段中)。那是因为修改实例会改变它们的散列,这会破坏事情。
归档时间: |
|
查看次数: |
601 次 |
最近记录: |