Python如何在对象之间建立相等?

时间:2012-01-25 05:06:29

标签: python object copy equality deep-copy

我将程序中的错误跟踪到我正在测试对象列表中是否存在对象的行。该行始终返回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,但是我没有足够的经验来熟悉它是什么时候,不是必要的,或者机械上有什么区别。我也听说过酸洗,但从未使用过它。有人可以向我解释这里发生了什么吗?

哦,还有一件事。这条线

if x in myIterable:

可能测试x和myIterable中每个元素之间的相等性,对吗?所以,如果我可以改变两个对象之间的感知平等,我可以修改该行的输出吗?是否内置了该内容和所有其他内联运算符?

3 个答案:

答案 0 :(得分:6)

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

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

  3. 也许你打算使用is来比较身份而不是相等。

答案 1 :(得分:1)

代码中的行myObject(0)==myObject(0)正在创建myObject的两个不同实例,并且由于您尚未定义__eq__,因此会对它们进行身份比较(即内存位置)。

x.__eq__(y) <==> x==y并且关于if x in myIterable:的{​​{1}}使用“比较相等”的行是正确的,除非可迭代定义in

__contains__

答案 2 :(得分: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)来设置eqality的条件。