Are Python sets mutable?

2019-03-15 01:52发布

问题:

Are sets in Python mutable?


In other words, if I do this:

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

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

Are x and y still pointing to the same object, or was a new set created and assigned to y?

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

Conclusion: sets are mutable.



回答2:

Your two questions are different.

Are Python sets mutable?

Yes: "mutable" means that you can change the object. For example, integers are not mutable: you cannot change the number 1 to mean anything else. You can, however, add elements to a set, which mutates it.

Does y = x; y |= {1,2,3} change x?

Yes. The code y = x means "bind the name y to mean the same object that the name x currently represents". The code y |= {1,2,3} calls the magic method y.__ior__({1,2,3}) under the hood, which mutates the object represented by the name y. Since this is the same object as is represented by x, you should expect the set to change.


You can check whether two names point to precisely the same object using the is operator: x is y just if the objects represented by the names x and y are the same object.

If you want to copy an object, the usual syntax is y = x.copy() or y = set(x). This is only a shallow copy, however: although it copies the set object, the members of said object are not copied. If you want a deepcopy, use copy.deepcopy(x).



回答3:

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


回答4:

print x,y

and you see they both point to the same set:

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


回答5:

Python sets are classified into two types. Mutable and immutable. A set created with 'set' is mutable while the one created with 'frozenset' is immutable.

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

The following methods are for mutable sets.

s.add(item) -- Adds item to s. Has no effect if listis already in s.

s.clear() -- Removes all items from s.

s.difference_update(t) -- Removes all the items from s that are also in t.

s.discard(item) -- Removes item from s. If item is not a member of s, nothing happens.

All these operations modify the set s in place. The parameter t can be any object that supports iteration.



回答6:

I don't think Python sets are mutable as mentioned clearly in book "Learning Python 5th Edition by Mark Lutz - Oreilly Publications"



标签: python set