Python 为什么嵌套字典可以,但嵌套集被禁止?

Python 为什么嵌套字典可以,但嵌套集被禁止?,python,dictionary,set,hashtable,Python,Dictionary,Set,Hashtable,为什么Python中允许使用嵌套字典,而不允许使用嵌套集 可以嵌套字典并动态更改子字典,如下所示: In [1]: dict1 = {'x':{'a':1, 'b':2}, 'y':{'c':3}} In [2]: dict2 = {'x':{'a':1, 'b':2}, 'y':{'c':3}} In [3]: dict1 == dict2 Out[3]: True In [4]: dict2['x'] = {'d':4} In [5]: dict1 == dict2 Out[5]: Fals

为什么Python中允许使用嵌套字典,而不允许使用嵌套集

可以嵌套字典并动态更改子字典,如下所示:

In [1]: dict1 = {'x':{'a':1, 'b':2}, 'y':{'c':3}}
In [2]: dict2 = {'x':{'a':1, 'b':2}, 'y':{'c':3}}
In [3]: dict1 == dict2
Out[3]: True
In [4]: dict2['x'] = {'d':4}
In [5]: dict1 == dict2
Out[5]: False
另一方面,如果您试图将集合放入集合中,则会出现一个错误,说明由于集合是“不可损坏类型”,因此无法执行该操作:

但是以后不能像对嵌套字典那样更改嵌套冻结集的内部结构


根据我所发现的,和都是用hash表实现的,所以我不明白为什么在一种情况下允许它,而在另一种情况下不允许它。

因为元素的hash在其生命周期中必须是唯一的,才能有意义地存储在hash表中,所以一个
集合(以及
列表
)正如您所观察到的,不能是
集合的成员。但是,在
dict
中,散列的对象是键,而不是值。因此,这是合法的:

{'x': {1, 2, 3}}  #  a string is hashable
这不是:

{{1, 2, 3}: 'x'}
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1{{1,2,3}:'x'}
TypeError:无法损坏的类型:“set”

对于其他不可损坏的类型也是如此(例如,
list
dict

问题是您的示例并不相同。字典的值没有限制,只有键有限制。下面是一个更准确的比较:

>>> d = {{'a': 'b'}: 'c'}

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    d = {{'a': 'b'}: 'c'}
TypeError: unhashable type: 'dict'
>>> s = {{'a': 'b'}, 'c'}

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    s = {{'a': 'b'}, 'c'}
TypeError: unhashable type: 'dict'
>d={{'a':'b'}:'c'}
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
d={{'a':'b'}:'c'}
TypeError:无法损坏的类型:“dict”
>>>s={{'a':'b'},'c'}
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
s={{'a':'b'},'c'}
TypeError:无法损坏的类型:“dict”
请注意,现在您得到了与预期相同的行为;您可以将
set
视为一个仅为
dict
的键

不能将可变/不可修改的对象用作字典中的键或集合中的元素,因为如果在适当的位置对其进行更改,它将变得不可恢复(Python匹配
\uuuuuueq\uuu
\uhash\uuuu
,这就是必须实现这些方法以使用自定义类作为键/元素的原因)。有关这方面的更多信息,请参见(不同的语言,但原理相同-都是哈希表)


你也可以考虑看你是否对这个话题感兴趣。

不明白为什么这会被否决。这是一个让我困惑的天才问题,我自己也做了一些工作来尝试解决它,包括自己尝试,在网上搜索答案都没有成功。哦,我明白了。我认为我的困惑是由于对set字典实现的误解。我认为集合元素是基础dict的值,而不是键。@NickAlger:在过去,在我们有
set
之前,我们必须将
{1,2,3}
实现为
{1:None,2:None,3:None}
,所以老年人往往忘记集合元素是键并不明显。:)但是如果你仔细想想,set的优点(即时查找、禁止重复等)都没有意义,除非元素是键。
{'x': {1, 2, 3}}  #  a string is hashable
{{1, 2, 3}: 'x'}
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-1cd059738afd> in <module>()
----> 1 {{1, 2, 3}: 'x'}
TypeError: unhashable type: 'set'
>>> d = {{'a': 'b'}: 'c'}

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    d = {{'a': 'b'}: 'c'}
TypeError: unhashable type: 'dict'
>>> s = {{'a': 'b'}, 'c'}

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    s = {{'a': 'b'}, 'c'}
TypeError: unhashable type: 'dict'