[英]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.