Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表和集合的成员资格测试有何不同?_Python_List_Set_Member - Fatal编程技术网

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__;()函数解决了这个问题。