Python中是否有对象唯一标识符

时间:2009-08-09 21:40:30

标签: python

这与java.lang.Object.hashcode()方法类似。

我需要在一个集合中存储我无法控制的对象,并确保只有当两个对象实际上是同一个对象(不包含相同的值)时才会覆盖这些值。

4 个答案:

答案 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>])

注意:您实际上不必覆盖哈希来证明此行为: - )