gpt4 book ai didi

python - 比较 Python 字典的方法与某些值类型失败?

转载 作者:行者123 更新时间:2023-11-28 17:49:10 25 4
gpt4 key购买 nike

我想不通。我有两本完全相同的词典。我使用标准方法来确定差异,应该没有差异。但是某些值类型总是作为差异返回,即使它们不是。例如,如果一个值是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com