新手问题 Python 判断Set中的对象是否相等
怪我咯
怪我咯 2017-04-17 17:38:07
[Python讨论组]

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)
ringa_lee
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
ringa_lee

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号