本文记录 Python Set 判定为同一对象的原理。
Python 中的集合(set)确实是通过 __hash__
方法来判定两个对象是否相同的。在 Python 中,集合是一个无序的、不重复的元素集。当您将一个对象添加到集合中时,Python 会调用该对象的 __hash__
方法来获取它的哈希值,再调用 __eq__
方法双重判定是否为同一对象。
__hash__
方法来计算它的哈希值。__eq__
方法来确认这两个对象是否真的相同。这是因为在不同的对象上可能计算出相同的哈希值(哈希冲突)。只有在两个对象的哈希值相同,并且它们通过 __eq__
方法比较也返回 True
时,Python 才会认为这两个对象是相同的,因此在集合中它们被视为同一个元素,不会重复添加。
class MyClass:
def __init__(self, id, value):
self.id = id
self.value = value
def __hash__(self):
return hash(self.id)
def __eq__(self, other):
if isinstance(other, MyClass):
return self.value == other.value
return False
obj1 = MyClass(1, 10)
obj2 = MyClass(2, 10)
obj3 = MyClass(1, 20)
obj4 = MyClass(2, 20)
obj5 = MyClass(1, 20)
my_set = {obj1, obj2, obj3, obj4, obj5}
print(len(my_set)) # 输出 4,因为 obj3 和 obj5 被视为相同
文章链接: