【问题标题】:How does Python establish equality between objects?Python如何建立对象之间的相等性?
【发布时间】:2012-01-25 05:06:28
【问题描述】:

我在我的程序中跟踪到我正在测试对象列表中是否存在对象的行。该行始终返回 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__魔术方法。

标签: python object copy equality deep-copy


【解决方案1】:
  1. 它将第二个操作数传递给第一个操作数的__eq__() 方法。

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

也许您打算使用 is,它比较 identity 而不是相等。

【讨论】:

    【解决方案2】:

    代码中的 myObject(0)==myObject(0) 行正在创建 myObject 的两个不同实例,并且由于您尚未定义 __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)
    

    【讨论】:

      【解决方案3】:

      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) 来设置平等的条件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-14
        • 1970-01-01
        • 1970-01-01
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-25
        相关资源
        最近更新 更多