为什么设置嵌套没有在Python中实现?

为什么设置嵌套没有在Python中实现?,python,set,Python,Set,为什么在Python(2.x和3.x)中没有实现集合嵌套(在数学中使用)?它已经实现,但是您需要使用一个。是那种类型的。文档甚至告诉您: 要表示集合的集合,内部集合必须是frozenset对象 演示: 这是因为常规的set()是可变的,这与用于集合(和字典)的数据结构的要求不兼容;这些需要稳定的对象,当根据它们的散列用作表中的键时,可以重新定位这些对象 文件再次: set类型是可变的-可以使用add()和remove()等方法更改内容。因为它是可变的,所以它没有散列值,不能用作字典键或另一个集合

为什么在Python(2.x和3.x)中没有实现集合嵌套(在数学中使用)?

它已经实现,但是您需要使用一个。是那种类型的。文档甚至告诉您:

要表示集合的集合,内部集合必须是
frozenset
对象

演示:

这是因为常规的
set()
是可变的,这与用于集合(和字典)的数据结构的要求不兼容;这些需要稳定的对象,当根据它们的散列用作表中的键时,可以重新定位这些对象

文件再次:

set
类型是可变的-可以使用
add()
remove()
等方法更改内容。因为它是可变的,所以它没有散列值,不能用作字典键或另一个集合的元素。
frozenset
类型是不可变和可散列的-其内容在创建后不能更改;因此,它可以用作字典键或另一个集合的元素


正如@Martin Pieters提到的,如果使用frozenset对象而不是常规集,这是可能的,因为frozenset对象是可散列的

这是因为python的普通容器(list、dict、set等)是可变的,这意味着它们可以在其生命周期中更改(可以向集合中添加元素)。可变数据类型不能是可散列的(因为可散列基本上意味着“用唯一的数字(=散列)标识不可变对象”)

frozenset对象是可散列的,这意味着它们可以在集合中使用,其代价是在创建frozenset后无法再更改它(frozenset没有可用的update()方法)。这意味着如果要更改嵌套在集合中的冻结集,必须从冻结集创建一个新集合,对该集合进行更改,删除旧的冻结集,然后将新集合转换为冻结集并添加它(这似乎很复杂,如果难以理解,请告诉我)


集合只能由可散列对象组成的原因在于集合中的每个对象都必须是该集合的唯一对象,python通过使用对象的散列来检查这一点,因为这是一种高效而安全的方法。

请注意,即使您使用的是zensets。您必须单独检查每个子集/子列表。集合只包含唯一的元素,因此哈希用于确定相等性。集合不可哈希,因为它们是可变的:@msvalkon:我甚至不希望li中的
3返回
True
。因为这将是对该表达式的不同计算han精通数学。鉴于Python开发人员希望集合是可变的,这就解释了为什么必须创建frozenset类型。酷!
>>> li = [2, [3, 4]]
>>> 3 in li
False

>>> {2, {3, 4}}
TypeError: unhashable type: 'set'
>>> {2, frozenset([3, 4])}
set([frozenset([3, 4]), 2])