Python集__contains__找不到集合中包含的对象

时间:2018-12-07 22:45:22

标签: python set contains

(在Linux上为python 3.7.1)

我观察到一些奇怪的行为,将用户定义的对象存储在一组中。这些对象非常复杂,因此在卡片上没有一个最小的例子-但我希望观察到的行为会引起比我本人聪明的人的解释。在这里:

>>> from mycode import MyObject
>>> a = MyObject(*args1)
>>> b = MyObject(*args2)
>>> a == b
False
>>> z = {a, b}
>>> len(z)
2
>>> a in z
False

我的理解是,如果(1)它的哈希与集合中某个对象的哈希匹配,并且(2)它等于该对象,则该对象位于集合中。但是这些期望在这里违反了:

>>> [hash(t) for t in z]
[1013724486348463466, -1852733432963649245]
>>> hash(a)
1013724486348463466
>>> [(hash(t) == hash(a), t == a) for t in z]
[(True, True), (False, False)]
>>> [t is a for t in z]
[True, False]

也是所有语法中最奇怪的:

>>> [t in z for t in z]
[False, False]

MyObject可能会发生什么,使其表现为这种方式?回顾一下:__hash__具有健全的__eq__set函数,class MyObject(object): ... def __hash__(self): return hash(self.link) def __eq__(self, other): """ two entities are equal if their types, origins, and external references are the same. internal refs do not need to be equal; reference entities do not need to be equal :return: """ if other is None: return False try: is_eq = (self.external_ref == other.external_ref and self.origin == other.origin and self.entity_type == other.entity_type) except AttributeError: is_eq = False return is_eq 只是一个普通的python集。

这里是他们:

a == t

所有这些属性都在这些对象上定义。如上所述,对于集合中的一个对象,True的值为<input type="hidden" id="ID<?=$product['id'];?>" name="ID" value="<? =$product['id'];?>"> <input type="hidden" id="name<?=$product['id'];?>" name="hidden_name" value="<?=$product['title'];?>"> 。感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

我在将对象添加到集合后对其进行了变异。定义的哈希函数不是静态的。