Python设置是否可变?

Hub*_*bro 23 python set

Python中的集合是否可变?


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

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

y |= set([4, 5, 6])
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*rdt 41

>>>> 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])
Run Code Online (Sandbox Code Playgroud)

结论:集合是可变的.

  • 注意,存在一个内置的不可变集合类:[`frozenset`](http://docs.python.org/2.7/library/stdtypes.html#frozenset). (15认同)

Kat*_*iel 16

你的两个问题是不同的.

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

  • 我不明白这两个问题是如何不同的.如果集合不可变,`y`将指向与`x`不同的对象,就像字符串连接一样. (2认同)

viv*_*vek 10

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

>>> s = set(list('hello'))
>>> type(s)
<class 'set'>
Run Code Online (Sandbox Code Playgroud)

以下方法适用于可变集。

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

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

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

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

所有这些操作都会在适当的位置修改 set 。参数 t 可以是任何支持迭代的对象。