代码之家  ›  专栏  ›  技术社区  ›  oneself

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

  •  59
  • oneself  · 技术社区  · 15 年前

    这将类似于java. Lang.Objist.HasCODE()方法。

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

    4 回复  |  直到 10 年前
        1
  •  92
  •   ilya n.    15 年前
    id(x)
    

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

    对于您的特定问题,我可能会保留一组ID或包装器对象。包装对象将包含一个引用,并按 x==y &==& gt; x.ref is y.ref .

    同样值得注意的是,python对象具有 hash 功能也一样。此函数是将对象放入集合或字典所必需的。它有时会针对不同的对象发生碰撞,尽管 搞砸 尽量减少这种可能性。

        2
  •  27
  •   Grijesh Chauhan Anand Krishnan    11 年前

    那就是“ is “是的。

    而不是测试” if a == b “,测试相同的值,

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

        3
  •  1
  •   Ned Batchelder    15 年前

    正如IlyaN所提到的,ID(X)为对象生成一个唯一的标识符。

    但是你的问题令人困惑,因为Java的hash码方法没有给出唯一的标识符。Java的哈希代码像大多数散列函数一样工作:它总是为同一个对象返回相同的值,两个相等的对象总是得到相等的代码,而不等的哈希值意味着不相等的哈希代码。特别是,两个不同和不相等的对象可以得到相同的值。

    这是令人困惑的,因为加密散列函数与此非常不同,而且更像(但不完全是)您请求的“唯一ID”。

    Java的Hash码方法的Python等价是哈希(x)。

        4
  •  -1
  •   Vamsi Nerella    10 年前

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

    注意:您真的不必重写 搞砸 为了证明这种行为:—)