Python中的集合是可变的吗?
换句话说,如果我这样做:
x = set([1, 2, 3])
y = x
y |= set([4, 5, 6])
是否仍然指向同一个对象,或者是否创建了一个新集合并将其分配x
给?y
y
>>>> 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.
结论:集合是可变的。
你的两个问题不一样。
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
,因此您应该期望该集合发生变化。
您可以使用运算符检查两个名称是否指向完全相同的对象is
:x is y
只要名称所代表的对象x
和y
是相同的对象。
如果要复制对象,通常的语法是y = x.copy()
or y = set(x)
。然而,这只是一个浅拷贝:虽然它复制了集合对象,但所述对象的成员并没有被复制。如果您想要深拷贝,请使用copy.deepcopy(x)
.
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 可以是任何支持迭代的对象。
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
print x,y
你会看到它们都指向同一个集合:
set([1, 2, 3, 4, 5, 6]) set([1, 2, 3, 4, 5, 6])
是的,Python 集合是可变的,因为我们可以在集合中添加、删除元素,但集合本身不能包含可变项。像下面的代码会报错:
s = set([[1,2,3],[4,5,6]])
所以集合是可变的,但不能包含可变项,因为集合内部使用哈希表来存储其元素,因此集合元素需要是可哈希的。但是像列表这样的可变元素是不可散列的。
注意:
可变元素不可散列
不可变元素可散列
就像字典的键不能是列表一样。
集合是可变的
s = {2,3,4,5,6}
type(s)
<class 'set'>
s.add(9)
s
{2, 3, 4, 5, 6, 9}
我们能够改变集合的元素