Python sets have these methods:
s.union(t) s | t new set with elements from both s and t
s.update(t) s |= t return set s with elements added from t
Likewise, there's also these:
s.intersection_update(t) s &= t return set s keeping only elements also found in t
s.intersection(t) s & t new set with elements common to s and t
And so on, for all the standard relational algebra operations.
So...question is, what exactly is the difference here? I see that it says that the update() versions returns s instead of a new set, but if I write x = s.update(t)
, does that means that id(x) == id(s)
? Are they references to the same object now?
I mean, I don't really see why both sets of methods are implemented. It doesn't seem to add any significant functionality.
The
_update
methods modify the set in-place and return None. The methods withoutupdate
return a new object. You almost certainly do not want to dox = s.update(t)
, since that will setx
to None.The functionality added by the
_update
methods is the ability to modify existing sets. If you share a set between multiple objects, you may want to modify the existing set so the other objects sharing it will see the changes. If you just create a new set, the other objects won't know about it.They are very different. One set changes the set in place, while the other leaves the original set alone, and returns a copy instead.
Note how
s
has remained unchanged.Now I've changed
s
itself. Note also that.update()
didn't appear to return anything; it did not returns
to the caller and the Python interpreter did not echo a value.Methods that change objects in-place never return the original in Python. Their return value is always
None
instead (which is never echoed).It looks like the docs don't state it in the clearest way possible, but
set.update
doesn't return anything at all (which is equivalent to returningNone
), neither doesset.intersection_update
. Likelist.append
orlist.extend
ordict.update
, they modify the container in place.Edit: actually, the docs don't say what you show in the question. They say:
and