这与java.lang.Object.hashcode()方法类似。
我需要在一个集合中存储我无法控制的对象,并确保只有当两个对象实际上是同一个对象(不包含相同的值)时才会覆盖这些值。
答案 0 :(得分:95)
id(x)
会为你做的伎俩。但我很好奇,这组对象有什么不对(它按值组合对象)?
对于您的特定问题,我可能会保留一组id或包装器对象。包装器对象将包含一个引用,并按x==y
< ==>进行比较。 x.ref is y.ref
。
值得注意的是,Python对象也具有hash
功能。将对象放入集合或字典中是必需的。尽管hash
的良好实现试图降低它的可能性,但它有时会碰撞不同的对象。
答案 1 :(得分:29)
这就是“is
”的用途。
而不是测试“if a == b
”,它测试相同的值,
测试“if a is b
”,它将测试相同的标识符。
答案 2 :(得分:2)
正如ilya提到的,id(x)为对象生成唯一标识符。
但是你的问题很混乱,因为Java的hashCode方法没有给出唯一的标识符。 Java的hashCode与大多数哈希函数一样工作:它总是为同一个对象返回相同的值,两个相等的对象总是得到相等的代码,不等的哈希值意味着不相等的哈希代码。特别是,两个不同且不相等的对象可以获得相同的值。
这很令人困惑,因为加密哈希函数与此完全不同,更像是(但并不完全)您要求的“唯一ID”。
Java的hashCode方法的Python等价物是hash(x)。
答案 3 :(得分:-1)
在将对象放入集合之前,您不必比较对象。 set()语义已经解决了这个问题。
class A(object):
a = 10
b = 20
def __hash__(self):
return hash((self.a, self.b))
a1 = A()
a2 = A()
a3 = A()
a4 = a1
s = set([a1,a2,a3,a4])
s
=> set([<__main__.A object at 0x222a8c>, <__main__.A object at 0x220684>, <__main__.A object at 0x22045c>])
注意:您实际上不必覆盖哈希来证明此行为: - )