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