我在Python中有以下示例性设置:
a = list(frozenset(['haha', 'lol']))
b = list(frozenset(['lol', 'haha']))有吗?
a == b
总是还真吗?
相同元素的冻结列表是否有可能在上面的设置中返回False?
发布于 2018-07-29 07:55:48
(冻结)集之间的等价语义是,如果它们包含等效项,则它们是等效的。集合没有秩序。
但是,由于list 有顺序,所以强制转换到列表可能会导致它们不等价(取决于(冻结的)集合的迭代顺序--这是实现细节)。
下面是内部实现中由于安装顺序(在CPython实现中)而导致不同迭代顺序的冲突的一个示例:
>>> a = list(frozenset([1, 9]))
>>> b = list(frozenset([9, 1]))
>>> a == b
False使用字符串的示例:
首先,我们需要找出一次碰撞(我不会详细说明):
>>> hash('1') % 8
0
>>> hash('2') % 8
5
>>> hash('3') % 8
2
>>> hash('4') % 8
3
>>> hash('5') % 8
1
>>> hash('6') % 8
4
>>> hash('7') % 8
5 # same as '2' ! Found!现在,我们需要按不同的顺序添加到集合中,以导致重散列(同样,不详细说明):
>>> s1, s2 = '2', '7'
>>> a = list(frozenset([s1, s2]))
>>> b = list(frozenset([s2, s1]))
>>> a == b
Falsehttps://stackoverflow.com/questions/51578335
复制相似问题