3

私はこれを理解することはできません。同一の辞書が 2 つあります。私は標準的な方法を使用して違いを判断しますが、その違いはありません。ただし、特定の値の型は、そうでない場合でも、常に違いとして返されます。たとえば、値が の場合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

なに???????!?!??!!?

4

1 に答える 1

2

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

モンキー パッチを適用すると一見無関係なコードが壊れる可能性があるため、可能な場合は値を比較してください。

于 2012-11-20T02:41:08.680 に答える