是一组在Python可变的?
换句话说,如果我这样做:
x = set([1, 2, 3])
y = x
y |= set([4, 5, 6])
是x
和y
仍指向同一对象,或者是一组新创建并分配给y
?
是一组在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])
结论:套是可变的。
你的两个问题是不同的。
是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
只是如果由名称所代表的对象x
和y
是同一个对象。
如果要复制的对象,通常的语法为y = x.copy()
或y = set(x)
这仅仅是一个浅拷贝,但是:尽管它的副本设定的目标,上述对象的成员不会被复制。 如果你想有一个deepcopy的,使用copy.deepcopy(x)
改变设定之后,甚至他们的对象引用匹配。 我不知道为什么教材说集是不可改变的。
>>> 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的集合被分为两种类型。 可变和不可变的。 用“设置”创建的组是可变的,而与“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可以是支持迭代的任何物体。
我不认为在本书“ 学习Python的第5版的马克·鲁茨-奥赖利出版物 ”中明确提到的Python套是可变的,