Python 使用冻结集作为Dict密钥安全吗?

Python 使用冻结集作为Dict密钥安全吗?,python,python-2.7,hashmap,frozenset,Python,Python 2.7,Hashmap,Frozenset,它显然是有效的,但是否有两组相同的元素碰巧在Dict中添加了两个条目的情况?我想我之前遇到过这种情况,并将代码从frozenset(…)更改为tuple(sorted(frozenset(…))。知道如何使用Dict和frozenset实现的人能否确认是否需要这样做 使用frozenset作为dict键是否安全是。 根据文档,Frozenset是可散列的,因为它是不可变的。这意味着它可以用作dict的键,因为键的先决条件是它是可散列的 从 frozenset类型是不可变和可散列的-其内容在创建后

它显然是有效的,但是否有两组相同的元素碰巧在Dict中添加了两个条目的情况?我想我之前遇到过这种情况,并将代码从
frozenset(…)
更改为
tuple(sorted(frozenset(…))
。知道如何使用Dict和frozenset实现的人能否确认是否需要这样做

使用
frozenset
作为
dict
键是否安全是。

根据文档,Frozenset是可散列的,因为它是不可变的。这意味着它可以用作dict的键,因为键的先决条件是它是可散列的

frozenset类型是不可变和可散列的-其内容在创建后不能更改;因此,它可以用作字典键或另一个集合的元素

并且从以下方面进行冗余:

…键,可以是任何不可变类型


要澄清的是,集合(根据定义),无论是否冻结,都不会保持顺序。它们在内部存储时不考虑顺序,并且删除了重复元素,因此以不同顺序构建的两个集合将是字典中的等效键–它们是相同的

>>> frozenset([1,2,2,3,3]) == frozenset([3,2,1,1,1])
True
同样地

>>> d = {}
>>> d[frozenset([1,1,2,3])] = 'hello'
>>> d[frozenset([1,2,3,3])]
'hello'
>>> d[frozenset([3,3,3,2,1,1,1])]
'hello'
>>> d[frozenset([2,1,3])]
'hello'

frozenset类型是不可变和可散列的-其内容在创建后不能更改因此,它可以用作字典键或另一个集合的元素

(重点是我的)

是否存在两组相同元素在Dict中添加两个条目的情况

不,不取决于元素的顺序,只取决于元素本身。具有相同元素的两个FS相等且具有相同的散列,因此满足“dict标识”的两个标准,换句话说,它们是相同的dict密钥:

>>> a = frozenset([1,1,1,1,2,3])
>>> b = frozenset([3,3,3,3,2,1])
>>> {a:1, b:2}
{frozenset([1, 2, 3]): 2}

这就是它的目的。如果您有一个导致问题的示例,请发布它。但问题是,以不同顺序构建但最终值相同的Frozenset是否具有不同的哈希值。答案是否定的,它们没有不同的散列值。我认为这是可以理解的,因为根据定义,集合不保留顺序。您回答是肯定的,这意味着您认为散列可以不同,因此必须使用
tuple(排序(frozenset(…))
。这不是散列性或顺序的问题,而是散列值的问题。