繁体   English   中英

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

[英]How does Python establish equality between objects?

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

哦,还有一件事。 这条线

if x in myIterable:

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

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

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

也许你打算使用is ,它比较身份而不是平等。

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

x.__eq__(y) <==> x==y和您对于线if x in myIterable:使用“比较等于”为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)

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的条件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM