我想不通。我有两本完全相同的词典。我使用标准方法来确定差异,应该没有差异。但是某些值类型总是作为差异返回,即使它们不是。例如,如果一个值是 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('502e232ca7919d27990001e4')
创建一个新对象,默认情况下 !=
比较引用。尝试例如:
class Obj:
def __init__(self, value):
self.value = value
print Obj(1234) == Obj(1234) # False
这将评估为 false,因为它们是不同的实例,即使它们具有相同的值。为使其工作,该类必须实现 eq 方法:
class Obj:
def __init__(self, value):
self.value = value
def __eq__(self, other):
return self.value == other.value
print Obj(1234) == Obj(1234) # True
要解决这个问题,您可以对类进行“猴子修补”:
class Obj:
def __init__(self, value):
self.value = value
print Obj(1234) == Obj(1234) # False
Obj.__eq__ = lambda a, b: a.value == b.value
print Obj(1234) == Obj(1234) # True
或者直接通过值比较。
print Obj(1234).value == Obj(1234).value
尽可能比较值,因为猴子修补可能会破坏看似无关的代码。
关于python - 比较 Python 字典的方法与某些值类型失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13465562/