Python中的集合是否可变?
换句话说,如果我这样做:
x = set([1, 2, 3])
y = x
y |= set([4, 5, 6])
x
和y
仍然指向同一个对象,还是创建并分配给y
的新集?
答案 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
,只要名称x
和y
表示的对象是相同的对象。
如果要复制对象,通常的语法为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)