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

Python中是否有对象唯一标识符,python,Python,这类似于java.lang.Object.hashcode()方法 我需要将我无法控制的对象存储在一个集合中,并确保只有当两个对象实际上是同一个对象(不包含相同的值)时,才会覆盖这些值 id(x) 我会帮你的。但我很好奇,这组对象(它按值组合对象)有什么不对 对于您的特定问题,我可能会保留一组ID或包装器对象。包装器对象将包含一个引用,并通过x==yx.ref是y.ref进行比较 还值得注意的是,Python对象也有一个散列函数。此函数是将对象放入集合或字典中所必需的。虽然散列的良好实现尽量减

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

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

id(x)
我会帮你的。但我很好奇,这组对象(它按值组合对象)有什么不对

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

还值得注意的是,Python对象也有一个
散列
函数。此函数是将对象放入集合或字典中所必需的。虽然
散列
的良好实现尽量减少冲突的可能性,但对于不同的对象,它有时会发生冲突。

这就是“
的作用

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

测试“
如果a是b
”,它将测试相同的标识符。

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

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

这是令人困惑的,因为加密哈希函数与此完全不同,更像(尽管不完全是)您要求的“唯一id”


Python与Java的hashCode方法的等价物是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>])
A类(对象):
a=10
b=20
定义散列(自我):
返回散列((self.a,self.b))
a1=A()
a2=A()
a3=A()
a4=a1
s=集合([a1、a2、a3、a4])
s
=>设置([,])

注意:您真的不必重写散列来证明此行为:-)

注意Java中的
hashCode()
不一定是唯一的,它只是与
equals()
结合使用了一些精心选择的语义,正如Python的
hash()下面所述
的语义与
java.lang.Object.hashcode()
完全相同。可以准确地说Python的“is”类似于java的“==”,Python的“==”类似于java的“equals()”?这就是我明确提到java.lang.Object的hashcode方法的原因。默认情况下,为该对象生成唯一的long。我意识到hashcode的其他实现可能也确实不同,但这就是问题所在:hashcode不会产生唯一的long。它会产生尽量避免冲突的long,但是你不能将字符串映射到long并产生一个唯一的值……还有我知道的旧线程。但我确实想指出,id()只有在两个对象都存在时才是唯一的。一旦释放,该id可能会被分配给另一个对象,每“两个具有非重叠生存期的对象可能具有相同的id()值。”但在Python中,哈希(.)
不适用于列表。。。我知道列表是可变的,但我只需要根据列表的内容生成一个数字。也许sum(myList)是一个糟糕的散列函数……您的解决方案取决于继承自的类的类型:
class B(str):如果使用
set([B(),B()])调用pass
将导致
set([''])
。字典中的标识通常隐式地依赖于
id(x)
对于对象,您应该显式地使用它,并避免使用角型。@arnerecnangel您是对的。但在检查id(x)之后,你会在一个集合中放入什么呢?向下选择一个,因为id(x)不能确保每个对象的唯一性。OP非常清楚,他/她希望将包含相同值的不同对象视为不同的。@Roy相反,
id(x)
的说法是“保证此对象在其生命周期内唯一且恒定”,这将导致具有相同值的不同对象具有不同的id(只要它们同时存在)这将使OP能够做他们想做的事情。@Sparrow我明白了。我同意你的看法。关键是“当两个具有相同值的对象共存时,ID是唯一的”。
ID()
似乎为重复创建(和销毁)返回相同的ID具有相同值的对象,因此是我的原始注释,但实际上这在这里没有问题,因为OP声明当对象共存时ID必须是唯一的。删除我的否决票。啊,现在不能更改我的投票,太晚了。对于混淆和不正确的投票(诚实的错误),我深表歉意在本例中,@flow2k
x.ref
是将包装分配给变量
x
后,包装中包含对原始
x
的引用的属性的名称。