簡體   English   中英

Python中是否有對象唯一標識符

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM