Python如何判断对象的相等性?

4

我发现程序中的一个错误,出现在判断对象是否在对象列表中的代码行。这个代码行总是返回False,意味着该对象不在列表中。事实上,即使我尝试以下操作,这种情况仍然持续存在:

class myObject(object):
    __slots__=('mySlot')
    def __init__(self,myArgument):
        self.mySlot=myArgument
print(myObject(0)==myObject(0))        # prints False
a=0
print(myObject(a)==myObject(a))        # prints False
a=myObject(a)
print(a==a)                            # prints True

我以前使用过deepcopy,但是对于Python来说,我没有足够的经验来知道什么时候需要它,或者机械地了解差异。我也听说过pickling,但从未使用过。有人能向我解释一下这里发生了什么吗?

哦,还有一件事。这行代码:

if x in myIterable:

这句代码很可能在x和myIterable中的每个元素之间进行相等性测试,对吧?那么如果我可以改变两个对象之间的相等关系,那么我就可以修改该行代码的输出了?是否有内置的方法支持所有内联运算符的操作?


1
如果您想重新定义相等性,可以在您的类上定义__eq__魔术方法。 - Michael Mior
3个回答

6
  1. 它将第二个操作数传递给第一个的__eq__()方法。

  2. 不正确。它将第一个操作数传递给第二个的__contains__()方法,或者如果没有这样的方法,则迭代第二个执行相等比较。

也许你想使用比较身份is


1

你代码中的行 myObject(0)==myObject(0) 创建了两个不同的 myObject 实例,由于你没有定义 __eq__,它们被比较的是身份(即内存位置)。

x.__eq__(y) <==> x==y 以及你关于 if x in myIterable: 使用 "comparing equal" 来判断 in 关键字是正确的,除非可迭代对象定义了 __contains__

print(myObject(0)==myObject(0))        # prints False

#because id(left_hand_side_myObject) != id(right_hand_side_myObject)

a=0
print(myObject(a)==myObject(a))        # prints False

#again because id(left_hand_side_myObject) != id(right_hand_side_myObject)

a=myObject(a)
print(a==a)                            # prints True

#because id(a) == id(a)

1

myObject(a) == myObject(a)返回false,因为您正在创建两个不同的myObject实例(具有相同的属性a)。 因此,这两个对象具有相同的属性,但它们是类的不同实例,因此它们不相等。

如果您想检查对象是否在列表中,那么是的,

if x in myIterable

这可能是最简单的方法。

如果您想检查一个对象是否具有与列表中另一个对象完全相同的属性,可以尝试类似以下的代码:

x = myObject(a)
for y in myIterable:
    if x.mySlot == y.mySlot:
        print("Exists")
        break

或者,您可以在类定义中使用__eq__(self,other)来设置等式条件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接