[英]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中每个元素之间的相等性,对吧? 所以,如果我可以改变两个对象之间的感知平等,我可以修改该行的输出吗? 是否内置了该内容和所有其他内联运算符?
它将第二个操作数传递给第一个操作数的__eq__()
方法。
不正确。 它将第一个操作数传递给第二个操作数的__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.