Python 列表和集合的成员资格测试有何不同?
我很难弄清楚为什么第一个断言是正确的,而第二个断言会引发错误Python 列表和集合的成员资格测试有何不同?,python,list,set,member,Python,List,Set,Member,我很难弄清楚为什么第一个断言是正确的,而第二个断言会引发错误 subject_list = [Subject("A"), Subject("B"), Subject("C")] subject_set = set() subject_set.add(Subject("A")) subject_set.add(Subject("B")) subject_set.add(Subject("C")) self.assertIn(Subject("A"), subject_list) self.ass
subject_list = [Subject("A"), Subject("B"), Subject("C")]
subject_set = set()
subject_set.add(Subject("A"))
subject_set.add(Subject("B"))
subject_set.add(Subject("C"))
self.assertIn(Subject("A"), subject_list)
self.assertIn(Subject("A"), subject_set)
以下是错误:
Traceback (most recent call last):
File "C:\Users\...\testSubject.py", line 34, in testIn
self.assertIn(Subject("A"), subject_set)
AssertionError: <Subject: A> not found in set([<Subject: B>, <Subject: C>, <Subject: A>])
回溯(最近一次呼叫最后一次):
testIn中第34行的文件“C:\Users\…\testSubject.py”
断言(主语(“A”),主语集合)
AssertionError:在集合([,])中找不到
Subject类中的相等性测试只是
self.name==other.name
,在另一个单元测试中,我验证Subject(“A”)==Subject(“A”)
。我真的不明白为什么这个主题在列表中而不在集合中。理想情况下,我希望主题同时出现在这两个列表中。要在一个集合中使用它们,您必须确保subject
可以正确散列。如果您不自己定义\uuuuuuuuuuuuuuuuuuu散列
,它将只接受id,这对于不同的实例是不同的<代码>\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。试试这个:
def __hash__(self):
return hash(self.name)
文档是。集合中的成员身份也取决于对象的散列,因此您必须在类上适当地实现\uuuuuuhash\uuuuu()
方法。表达式
Subject("A") in subject_list
Subject("A") in subject_set
将使用Subject.\uu eq\uuu()
方法将Subject(“A”)
与Subject\u列表中的每个条目进行比较。如果未覆盖此方法,则默认情况下,除非两个操作数是同一对象,否则它始终返回False
。如果Subject
缺少\uuuuu eq\uuuu()
方法,则上述表达式将始终返回False
,因为Subject(“a”)
是一个新实例,不能已经在列表中
表情
Subject("A") in subject_list
Subject("A") in subject_set
相反,将首先使用Subject.\uuu hash\uu()
找到正确的存储桶,然后才使用Subject.\uu eq\uu()
。如果您没有以与主题兼容的方式定义主题。
。\uuuuuuuuuuuuuuuuuuuu hash()
,此操作将失败。谢谢!在Subject类中实现一个_uhash__;()函数解决了这个问题。