我有一个用户定义的类 MyClass
,它具有 __hash__
和 __eq__
实现,可确保例如:
>>> a = MyClass([100, 99, 98, 97])
>>> b = MyClass([99, 98, 97, 100])
>>> a.__hash__() == b.__hash__()
True
>>> a == b
True
问题:如果我执行以下操作:
>>> x = [a, b]
>>> set(x)
我可以指望set
保留a
吗?集合__init__
是否按顺序迭代x
?或者我是否需要担心它会随机获取 b
?
谢谢
迈克
最佳答案
在这些基于哈希的情况下,它同时使用 __hash__
和 __eq__
。
如果 __hash__
和 __eq__
相同,则采用迭代中的第一个。当它到达下一个时,它会检查是否已经拥有它并决定是。
>>> class Same(object):
... def __init__(self, value):
... self.value = value
... def __hash__(self):
... return 42
... def __eq__(self, other):
... return True
... def __repr__(self):
... return 'Same(%r)' % self.value
>>> set([Same(2), Same(1)])
set([Same(2)])
>>> set([Same(1), Same(2)])
set([Same(1)])
有了dict
,它就变得更有趣了:
>>> {Same(1): 1, Same(2): 2}
{Same(1): 2}
>>> {Same(1): 2, Same(2): 1}
{Same(1): 1}
>>> {Same(2): 1, Same(2): 2}
{Same(2): 2}
>>> {Same(2): 2, Same(2): 1}
{Same(2): 1}
>>> {Same(2): 2, Same(2): 1}
{Same(2): 1}
您应该能够猜到这里发生了什么。它存储第一个项目,然后第二个项目的散列/相等性相同;然而,它有一个不同的值,所以它存储它。 值总是被覆盖,无论它们是否匹配:
>>> {Same(1): Same(2), Same(3): Same(4)}
{Same(1): Same(4)}
希望对您有所帮助。
关于Python - 当识别出重复项时,集合或卡住集合采用哪个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4273686/