在在线上的任何地方都找不到详细信息,比较两个冻结集时,Python会迭代其中一组元素中的元素吗?还是因为冻结集是可哈希的,它是否会检查冻结集的哈希值?
答案 0 :(得分:3)
由于参考文档未对此进行任何说明,因此它依赖于实现,因此除了查看您所使用的Python版本的源代码(在CPython发行版的{{1}中)之外,没有任何答案。 }。查看Python 3.7.0的源代码,答案是“也许”;-)
平等首先检查冻结集的大小是否相同(Objects/setobject.c
)。如果不是,则它们不能相等,因此将立即返回len()
。
否则将比较如果已经计算出哈希码。如果已经计算出它们,那么如果哈希码不相等,则立即返回False
。调用逐个元素的其他代码,以检查一个元素是否是另一个元素的子集。
冻结集的哈希码并非仅针对哈希集的哈希值进行计算-这可能是一笔无法弥补的支出。因此必须强制执行。一开始,frozenset的主要用例是允许集合集,并且在 上下文中,哈希代码将作为将冻结集添加到包含集的正常部分进行计算。 C级集实现包含一个槽,用于记录哈希的计算时间(在计算时),并且初始化为-1(保留值,表示内部“无哈希码”)。
答案 1 :(得分:1)
hash(x) == hash(y)
并不意味着x == y
:
>>> help(hash)
hash(...)
hash(object) -> integer
Return a hash value for the object. Two objects with the same value have
the same hash value. The reverse is not necessarily true, but likely.
因此要比较两个frozenset
值是否相等,您仍然需要检查两个集合的大小是否相同,然后检查一个集合中的每个元素是否也位于另一个集合中。
我把它留给有很多空闲时间的读者作为练习,以查找具有相同散列值的两个不同的frozenset
。