簡體   English   中英

對象作為python詞典中的鍵

[英]objects as keys in python dictionaries

我試圖將一個對象用作python字典中的一個鍵,但它的表現方式我無法理解。

首先,我創建一個以對象為關鍵字的字典:

package_disseminators = {
  ContentType("application", "zip", "http://other/property") : "one",
  ContentType("application", "zip") : "two"
}

現在創建另一個與關鍵對象“相同”的對象。

content_type = ContentType("application", "zip", "http://other/property")

我給了ContentType對象自定義__eq__和自定義__str__方法,這樣__eq__方法比較__str__值。

現在,一些交互式python:

>>> for key in package_disseminators:
...     if key == content_type:
...             print "match"
...     else:
...             print "no match"
... 
no match
match

>>> content_type in package_disseminators.keys()
True

好的,所以看起來我的對象肯定被正確識別為一個鍵,所以:

>>> package_disseminators[content_type]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: (& (type="application/zip") (packaging="http://other/property") )

呃......好嗎? 所以content_type在package_disseminators.keys()列表中,但不是密鑰?

>>> package_disseminators.has_key(content_type)
False

顯然不是。

我假設Python用來確定相等性的比較過程在列表上的直接“in”語句和實際查找dict中的鍵之間有所不同,但我不知道如何。 任何提示或見解?

從python文檔:

字典的鍵幾乎是任意值。 不可清除的值,即包含列表,字典或其他可變類型(通過值而不是按對象標識進行比較)的值不能用作鍵。

Hashable定義如下

如果一個對象具有一個在其生命周期內永遠不會改變的哈希值(它需要__hash__()方法),並且可以與其他對象進行比較(它需要__eq__()__cmp__()方法),則該對象是可__cmp__() 比較相等的可哈希對象必須具有相同的哈希值。

Hashability使對象可用作字典鍵和set成員,因為這些數據結構在內部使用哈希值。

因此,如果要執行此操作,則需要覆蓋對象的默認__hash__()方法(有關詳細說明,請參閱下面的Steven Rumbalski的注釋)。


>>> content_type in package_disseminators.keys()
True

我認為這是有效的,因為dict.keys()返回一個列表,而__contains__可能會檢查相等性,但不會檢查相同的哈希值。

由於dicts是引擎蓋下的哈希表,因此您需要定義__eq____hash__才能工作。

基本的經驗法則是:

  • 對於__eq__比較相等的對象, __hash__必須返回相同的哈希值。

從你的描述,像

def __hash__(self):
    return hash(str(self))

應該管用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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