了解集合的python对象成员资格

了解集合的python对象成员资格,python,collections,membership,set,cmp,Python,Collections,Membership,Set,Cmp,如果我理解正确,将调用对象的_cmp__;()函数,以计算集合中的所有对象,同时确定对象是集合中的成员还是集合中的成员。 但是,对于集合而言,情况似乎并非如此: class MyObject(object): def __init__(self, data): self.data = data def __cmp__(self, other): return self.data-other.data a = MyObject(5) b = My

如果我理解正确,将调用对象的_cmp__;()函数,以计算集合中的所有对象,同时确定对象是集合中的成员还是集合中的成员。 但是,对于集合而言,情况似乎并非如此:

class MyObject(object):
    def __init__(self, data):
        self.data = data

    def __cmp__(self, other):
        return self.data-other.data

a = MyObject(5)
b = MyObject(5)

print a in [b]          //evaluates to True, as I'd expect
print a in set([b])     //evaluates to False

那么,如何在集合中测试对象成员身份?

集合在幕后使用dict,因此“in”语句检查对象是否作为dict中的键存在。由于对象未实现哈希函数,因此对象的默认哈希函数使用对象的id。因此,即使a和b是等效的,它们不是同一个对象,这就是正在测试的对象。

>xs=[]
>>> xs = []
>>> set([xs])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>>集合([xs]) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:不可损坏的类型:“列表”
给你。集合使用哈希,非常类似于dict。这对性能非常有帮助(成员资格测试是O(1),许多其他操作都依赖于成员资格测试),而且它也非常适合集合的语义:集合项必须是唯一的,不同的项将产生不同的哈希,而相同的哈希表示(理论上)重复


由于默认的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

在类中添加
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法会产生以下结果:

class MyObject(object):
    def __init__(self, data):
        self.data = data

    def __cmp__(self, other):
        return self.data - other.data

    def __hash__(self):
        return hash(self.data)


a = MyObject(5)
b = MyObject(5)

print a in [b] # True
print a in set([b]) # Also True!

正如其他人指出的,您的对象没有
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。谢谢:)//另外,感谢您发现我的非python本地评论习惯。