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

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

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

 id(x) 

会为你做的伎俩。 但是我很好奇,关于这个对象集合(它是通过值来组合对象)有什么不对?

对于你的特定问题,我可能会保留一组ID或包装对象。 包装器对象将包含一个引用,并通过x==y进行比较<==> x.ref is y.ref

同样值得注意的是,Python对象也有hash函数。 这个函数对于把一个对象放到一个集合或字典里是很有必要的。 它应该有时碰撞不同的对象,虽然好的实现hash尝试使其不太可能。

这就是“ is ”的意思。

不是testing“ if a == b ”,testing相同的值,

testing“ if a is b ”,这将testing相同的标识符。

正如ilya提到的,id(x)为对象产生一个唯一的标识符。

但是你的问题很混乱,因为Java的hashCode方法没有提供唯一的标识符。 Java的hashCode与大多数散列函数一样工作:它总是为同一个对象返回相同的值,两个相等的对象总是得到相同的代码,而不相等的散列值则意味着不相等的散列码。 特别是两个不同的对象可以得到相同的价值。

这是令人困惑的,因为encryption哈希函数与此完全不同,更像(但不完全)是您要求的“唯一ID”。

Java的hashCode方法的Python等价物是hash(x)。

放置在一个集合中之前,您不必比较对象。 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>]) 

注意:你真的不必重写散列来certificate这个行为:-)