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