考虑这个片段:
class SomeClass(object):
def __init__(self, someattribute="somevalue"):
self.someattribute = someattribute
def __eq__(self, other):
return self.someattribute == other.someattribute
def __ne__(self, other):
return not self.__eq__(other)
list_of_objects = [SomeClass()]
print(SomeClass() in list_of_objects)
set_of_objects = set([SomeClass()])
print(SomeClass() in set_of_objects)
其计算结果为:
True
False
谁能解释为什么“in”关键字对于集合和列表有不同的含义?
我希望两者都返回 True,特别是当被测试的类型定义了相等方法时。
意思是一样的,但是实现方式不同。列表只是检查每个对象,检查是否相等,因此它适用于您的类。设置首先对对象进行哈希处理,如果它们没有正确实现哈希,则该设置似乎不起作用。
你的班级定义了__eq__
,但没有定义__hash__
,因此对于集合或字典的键不能正常工作。规则为__eq__
and __hash__
是两个物体__eq__
as True 也必须具有相同的哈希值。默认情况下,对象根据其内存地址进行哈希处理。因此,根据您的定义相等的两个对象不提供相同的哈希值,因此它们违反了以下规则__eq__
and __hash__
.
如果您提供__hash__
实施,它会工作得很好。对于您的示例代码,它可能是:
def __hash__(self):
return hash(self.someattribute)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)