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

108 投票
4 回答
101635 浏览
提问于 2025-04-15 13:29

这就像是 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 实现会尽量减少这种情况的发生。

撰写回答