Python设置是否可变?

时间:2013-01-07 09:51:40

标签: python set

Python中的集合是否可变?


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

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

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

xy仍然指向同一个对象,还是创建并分配给y的新集?

8 个答案:

答案 0 :(得分:37)

>>>> 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])

结论:集合是可变的。

答案 1 :(得分:13)

你的两个问题不同。

  

Python设置是否可变?

是:“可变”意味着您可以更改对象。例如,整数不可变:您无法将数字1更改为其他任何内容。但是,您可以将元素添加到集合中,从而使其变异。

  

y = x; y |= {1,2,3}是否会更改x

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


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

如果要复制对象,通常的语法为y = x.copy()y = set(x)。这只是一个副本,但是:虽然它复制了set对象,但不会复制所述对象的成员。如果您需要深度复制,请使用copy.deepcopy(x)

答案 2 :(得分:3)

更改集后,甚至他们的对象引用也匹配。我不知道为什么那本教科书说集合是不可变的。

    >>> s1 ={1,2,3}
    >>> id(s1)
    140061513171016
    >>> s1|={5,6,7}
    >>> s1
    {1, 2, 3, 5, 6, 7}
    >>> id(s1)
    140061513171016

答案 3 :(得分:2)

print x,y

你看他们都指向同一套:

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

答案 4 :(得分:2)

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可以是任何支持迭代的对象。

答案 5 :(得分:0)

集合是可变的

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

我们能够更改set的元素

答案 6 :(得分:0)

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

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

因此,集合是可变的,但不能包含可变项,因为集合内部使用哈希表存储其元素,因此该集合元素必须是可哈希的。 但是诸如list之类的可变元素不可散列。

注意:
可变元素不可散列
不可变元素是可哈希的

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

答案 7 :(得分:-1)

我不认为Python集是可变的,正如书中所提到的那样#34; 学习Python第5版由Mark Lutz - Oreilly Publications &#34;

enter image description here