是Python的集可变的?(Are Python sets mutable?)

2019-08-05 21:19发布

是一组在Python可变的?


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

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

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

xy仍指向同一对象,或者是一组新创建并分配给y

Answer 1:

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

结论:套是可变的。



Answer 2:

你的两个问题是不同的。

是Python的集可变的?

是“可变”意味着你可以改变物体。 例如,要件是不可变的:你不能改变数1意味着任何东西。 你可以,但是,添加元素的集合,它变异了。

确实y = x; y |= {1,2,3} 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) 这仅仅是一个拷贝,但是:尽管它的副本设定的目标,上述对象的成员不会被复制。 如果你想有一个deepcopy的,使用copy.deepcopy(x)



Answer 3:

改变设定之后,甚至他们的对象引用匹配。 我不知道为什么教材说集是不可改变的。

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


Answer 4:

print x,y

你看它们都指向同一组:

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


Answer 5:

Python的集合被分为两种类型。 可变和不可变的。 用“设置”创建的组是可变的,而与“frozenset”创建的一个是不可变的。

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

下面的方法是可变的集合。

s.add(项目) - 添加项目到秒。 有没有效果,如果list已经在秒。

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

s.difference_update(T) - 删除所有从s,同时也是T中的项目。

s.discard(项目) - 从s删除项。 如果产品不是S的一员,没有任何反应。

所有这些操作修改集合S到位。 参数t可以是支持迭代的任何物体。



Answer 6:

我不认为在本书“ 学习Python的第5版的马克·鲁茨-奥赖利出版物 ”中明确提到的Python套是可变的,



文章来源: Are Python sets mutable?
标签: python set