新手问题 Python 判断Set中的对象是否相等
怪我咯
怪我咯 2017-04-17 17:38:07
0
2
461

python2.7, 新手问题, 代码如下:

class A(object):
    def __init__(self):
        pass
a = A()
b = A()

为什么a == A(),a == b 的返回结果都为False?
感觉很不合逻辑啊? 这是为什么?

收到解答, 那么又有了新的问题, 代码如下:

class A(object):
    def __init__(self, *args):
        self.args = args
    def __eq__(self, another):
        if type(self) == type(another) and self.__dict__ == self.__dict__:
            return True
        return False

a = A(1)
b = A(1)
print a==b
print [a] == [b]
print set([a]) == set([b])

结果为 True, True, False 为什么set会出现不一样的情况?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回覆(2)
左手右手慢动作
a == A()
a == b

實際上是呼叫__eq__操作符重載來監測物件是否相等,可見

class A(object):
def __init__(self):
    pass

def __eq__(self, other):
    print "__eq__ called"
    return True

a = A()
b = A()
print (a == A())
print(a == b)

監測物件位址用id()函數,例如 id(a) == id(b) 列印a和b是否指向一個位址, 比較物件內容和物件位址是2個意思,請參見

class A(object):
    def __init__(self, _id, _name, _age):
        self.mID = _id
        self.mName = _name
        self.mAge = _age

    def __eq__(self, other):
        return self.mID == other.mID

a = A(123, "tom", 23)
b = A(123, "jerry", 23)
c = A(234, "jerry", 23)
print a == b
print a == c
print id(a) == id(b)
#🎜#1) 判斷語句應該是if type(self) == type(another) and self.__dict__ == another.__dict__,後面不是self,筆誤

2) 你可以在__eq__裡加上print "__eq__ called",明顯是轉換成set之後比較不是用這個__eq__,而是__hash__方法
3) 盡量不要用__dict_ _吧,我個人覺得你明確用args已經很好了
4) 我個人不太喜歡用type來檢查類型,更喜歡下面的方式

def __eq__(self, another):
    assert isinstance(another, self.__class__)
    return self.args == another.args
左手右手慢动作

List 比較用的是__eq__
Set 比较用的是__hash__ , 因为本质上 set 是个建立在 dict(哈希表)上的结构.
你需要重载__hash__.
See more http://stackoverflow.com/questions/15326985/how-to-implement-eq-for-set-inclusion-test326985/how-to-implement-eq-for-set-inclusion-test326985/how-to-implement-eq-for-set-inclusion-test#🎜#🎜# #

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板