38

Python中的集合是可变的吗?


换句话说,如果我这样做:

x = set([1, 2, 3])
y = x

y |= set([4, 5, 6])

是否仍然指向同一个对象,或者是否创建了一个新集合并将其分配x给?yy

4

8 回答 8

54
>>>> x = set([1, 2, 3])
>>>> y = x
>>>> 
>>>> y |= set([4, 5, 6])

>>>> print x
set([1, 2, 3, 4, 5, 6])
>>>> print y
set([1, 2, 3, 4, 5, 6])
  • 集合是无序的。
  • 集合元素是唯一的。不允许重复元素。
  • 集合本身可以修改,但集合中包含的元素必须是不可变类型。
set1 = {1,2,3}

set2 = {1,2,[1,2]}  --> unhashable type: 'list'
# Set elements should be immutable.

结论:集合是可变的。

于 2013-01-07T09:53:46.160 回答
22

你的两个问题不一样。

Python 集合是可变的吗?

是的:“可变”意味着您可以更改对象。例如,整数是不可变的:您不能将数字更改为1其他任何含义。但是,您可以将元素添加到集合中,从而对其进行变异。

y = x; y |= {1,2,3}变化x吗?

是的。该代码y = x的意思是“将名称绑定到该名称当前代表y的同一对象”。x代码在底层y |= {1,2,3}调用了魔法方法y.__ior__({1,2,3}),它改变了 name 所代表的对象y。由于这与 表示的对象相同x,因此您应该期望该集合发生变化。


您可以使用运算符检查两个名称是否指向完全相同的对象isx is y只要名称所代表的对象xy是相同的对象。

如果要复制对象,通常的语法是y = x.copy()or y = set(x)。然而,这只是一个拷贝:虽然它复制了集合对象,但所述对象的成员并没有被复制。如果您想要深拷贝,请使用copy.deepcopy(x).

于 2013-01-07T10:00:44.990 回答
11

Python 集合分为两种类型。可变和不可变。使用“set”创建的集合是可变的,而使用“frozenset”创建的集合是不可变的。

>>> s = set(list('hello'))
>>> type(s)
<class 'set'>

以下方法适用于可变集。

s.add(item) -- 将项目添加到 s。list如果已经在 s 中,则无效。

s.clear() -- 从 s 中删除所有项目。

s.difference_update(t) -- 删除 s 中也在 t 中的所有项目。

s.discard(item) -- 从 s 中删除项目。如果 item 不是 s 的成员,则什么也不会发生。

所有这些操作都修改了 set 。参数 t 可以是任何支持迭代的对象。

于 2018-07-27T15:01:40.390 回答
3

After changing the set, even their object references match. I don't know why that textbook says sets are immutable.

    >>> s1 ={1,2,3}
    >>> id(s1)
    140061513171016
    >>> s1|={5,6,7}
    >>> s1
    {1, 2, 3, 5, 6, 7}
    >>> id(s1)
    140061513171016
于 2018-02-07T08:32:07.367 回答
2
print x,y

你会看到它们都指向同一个集合:

set([1, 2, 3, 4, 5, 6]) set([1, 2, 3, 4, 5, 6])
于 2013-01-07T09:53:25.467 回答
1

是的,Python 集合是可变的,因为我们可以在集合中添加、删除元素,但集合本身不能包含可变项。像下面的代码会报错:

s = set([[1,2,3],[4,5,6]])

所以集合是可变的,但不能包含可变项,因为集合内部使用哈希表来存储其元素,因此集合元素需要是可哈希的。但是像列表这样的可变元素是不可散列的。

注意:
可变元素不可散列
不可变元素可散列

就像字典的键不能是列表一样。

于 2019-08-14T12:30:10.397 回答
1

集合是可变的

s = {2,3,4,5,6}
type(s)
<class 'set'>
s.add(9)
s
{2, 3, 4, 5, 6, 9}

我们能够改变集合的元素

于 2019-07-11T10:55:18.487 回答
-3

我不认为 Python 集合是可变的,正如Mark Lutz - O'Reilly Publications 的“ Learning Python 第 5 版”一书中明确提到的那样

在此处输入图像描述

于 2017-12-25T07:13:21.413 回答