为什么在Python中 {1} == frozenset({1}) ?

8

我觉得在Python中,{1} == frozenset({1}) 的结果为 True 是很奇怪的。虽然setfrozenset 是不同的对象类型,但我并没有看到其他可迭代对象类型之间有这种相似性(例如,{1} == (1,) 的结果为 False)。为什么集合会出现这种行为?还有其他可迭代对象类型是否也具有类似的行为呢?


2
我知道 5 == 5.0,并且其他数字类型(例如 complex)也有类似的等价关系,所以我想知道是否存在其他可迭代类型之间的等价关系。 - Joel
1个回答

9
根据 Python2文档Python3文档set 的实例与 frozenset 的实例基于它们的成员进行比较。例如,"set('abc') == frozenset('abc')" 返回 True
在 Python3 文档中: setfrozenset 均支持集合到集合的比较。当且仅当每个集合中的每个元素都包含在另一个集合中(每个集合都是另一个集合的子集)时,两个集合才相等。如果第一个集合是第二个集合的真子集(是子集但不相等),则第一个集合小于另一个集合。如果第一个集合是第二个集合的真超集(是超集但不相等),则第一个集合大于另一个集合。

原因可能是由于哈希函数的存在,它们可以在O(1)时间内进行比较 - 非常方便。 - nosklo
5
他们做不到。 - user2357112
根据这个资源(https://wiki.python.org/moin/TimeComplexity),平均情况下的时间复杂度为O(1),最坏情况下的时间复杂度为O(n)。我不确定为什么O(n)是最坏情况下的时间复杂度,但我想这可能与哈希碰撞有关。你们两个知道原因吗? - Joel
2
@Joel:那是元素测试,而不是集合相等性。 - user2357112

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接