【发布时间】:2012-11-08 01:39:34
【问题描述】:
我想不通。我有两个相同的字典。我使用标准方法来确定差异,应该没有差异。但是某些值类型总是作为差异返回,即使它们不是。例如,如果一个值为pymongo.bson.ObjectId,则该方法无法将其评估为相同。
d1 = {'Name':'foo','ref1':ObjectId('502e232ca7919d27990001e4')}
d2 = {'Name':'foo','ref1':ObjectId('502e232ca7919d27990001e4')}
d1 == d2
返回:
True
但是:
set((k,d1[k]) for k in set(d1) & set(d2) if d1[k] != d2[k])
返回:
set([('ref1',Objectid('502e232ca7919d27990001e4'))])
所以我发现这很奇怪,不是吗?
d1['ref1'] == d2['ref1'] # True
d1['ref1'] != d2['ref1'] # False
什么?????!?!??!!?
【问题讨论】:
-
您的两个
ObjectId值是对同一个对象的引用,还是它们是不同的对象?ObjectId类是否适当地实现了__eq__?我试图用一个虚拟的ObjectId重现,但我得到了预期的结果(一个空集)。 -
这是一个很好的问题,因为根据the docs,“映射(字典)比较相等当且仅当它们的排序(键,值)列表比较相等。”所以
d1 == d2应该暗示d1[k] == d2[k]。 -
ObjectId可能是一个错误的类,其中hash(o)是基于例如o.value,但o1==o2不是。但如果相等和散列都不是基于值的,这是完全合理的行为。 -
@Blckknght 相同的对象。
__eq__结帐,但id不结帐 -
谢谢大家,对所有的红鲱鱼感到抱歉。它是一个错误jira.mongodb.org/browse/PYTHON-440
标签: python dictionary set