我想在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在确定列表中是否包含某个元素和在字典中查找键的相等比较过程不同,但我不知道具体差别。有什么提示或见解吗?
object
继承了一个__hash__
方法。但是默认实现为每个实例返回一个唯一值,因此除非你提供更好的实现,否则两个相等的实例将具有不同的哈希值。has_key
比较哈希值,而in
检查相等性,这就是为什么在你的示例中has_key
失败而in
成功的原因。 - Steven Rumbalski