繁体   English   中英

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

[英]Is there an object unique identifier in Python

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

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

id(x)

会帮你的忙。 但是我很好奇,对象集(按值组合对象)有什么问题?

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

还值得注意的是,Python对象也具有hash函数。 此功能对于将对象放入集合或字典是必需的。 尽管hash良好实现会降低它的可能性,但有时它可能会针对不同的对象发生冲突。

那就是“ is ”的意思。

与其测试“ if a == b ”(测试是否具有相同的值),

测试“ if a is b ”,它将测试相同的标识符。

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

但是您的问题令人困惑,因为Java的hashCode方法没有提供唯一的标识符。 Java的hashCode就像大多数哈希函数一样工作:它总是为同一个对象返回相同的值,两个相等的对象总是得到相等的代码,不相等的哈希值意味着不相等的哈希码。 特别是,两个不同且不相等的对象可以获得相同的值。

这是令人困惑的,因为加密哈希函数与此完全不同,并且更像(尽管不完全是)您所要求的“唯一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>])

注意:您实际上不必重写哈希即可证明这种行为:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM