Python中是否有对象唯一标识符?
这就像是 java.lang.Object.hashcode()
这个方法。
我需要把一些我无法控制的对象存储在一个集合里,并确保只有当两个对象实际上是同一个对象(而不是仅仅值相同)时,才会覆盖这些值。
4 个回答
2
正如ilya n提到的,id(x)可以给一个对象生成一个独特的标识符。
但是你的问题有点让人困惑,因为Java的hashCode方法并不能提供一个独特的标识符。Java的hashCode就像大多数哈希函数一样:对于同一个对象,它总是返回相同的值;两个相等的对象总是会得到相同的哈希值,而不同的哈希值则意味着对象不相等。特别是,两个不同且不相等的对象可能会得到相同的哈希值。
这让人感到困惑,因为加密哈希函数和这个是很不一样的,更像是你所问的“独特标识符”,虽然并不是完全一样。
在Python中,和Java的hashCode方法相对应的是hash(x)。
37
这就是"is
"的用处。
与其测试"if a == b
",这个是用来检查两个值是否相等,
不如测试"if a is b
",这个是用来检查它们是否是同一个东西。
162
id(x)
这个方法可以帮你解决问题。不过我很好奇,那个对象集合(它是通过值来组合对象的)有什么问题呢?
针对你的具体问题,我可能会选择保留一组ID或者包装对象。包装对象会包含一个引用,并且通过 x==y
来比较,也就是 x.ref is y.ref
。
另外值得一提的是,Python中的对象也有一个 hash
函数。这个函数是把对象放进集合或字典时必须用到的。不同的对象有时会产生相同的哈希值,虽然好的 hash
实现会尽量减少这种情况的发生。