[Tutor] How is "set(ls).add('a') evaluated? [Was: Re: A program that can check if all elements of the list are mutually disjoint]

boB Stepp robertvstepp at gmail.com
Sat Jun 5 22:08:12 EDT 2021


On Sat, Jun 5, 2021 at 8:57 PM David <bouncingcats at gmail.com> wrote:
>
> On Sun, 6 Jun 2021 at 11:37, boB Stepp <robertvstepp at gmail.com> wrote:
>
> > I have not played around with set's methods and operators to date, so
> > while trying to understand this code I tried out different things in
> > the interpreter.  Along the way I tried something and it surprised me:
> >
> > Python 3.9.5 (tags/v3.9.5:0a7dcbd, May  3 2021, 17:27:52) [MSC v.1928
> > 64 bit (AMD64)] on win32
> > Type "help", "copyright", "credits" or "license" for more information.
> > >>> ls = ["amba", "Joy", "Preet"]
> > >>> z = set(ls).add('a')
> > >>> z
> > >>> print(z)
> > None           # This surprised me.  I was expecting {'amba', 'Joy',
> > 'Preet', 'a'}.
>
> The set() object has an add() method that modifies
> its object and returns None.

I understand this.  But for "set(ls).add('a')" I am thinking the
following sequence of events occur:

1)  "set(ls)" creates the set-type object "{'amba', 'Joy', 'Preet'}.
2)  ".add('a')" method is called on this set object, resulting in the
new set object "{'amba', 'Joy', 'Preet', 'a'}
3)  "z" is now assigned to point to this resultant object.

But instead "z" refers to "None".  OTOH, the very similar sequence of
events *does* appear to happen for:

>>> zz = set(ls).union('a')
>>> zz
{'amba', 'Joy', 'Preet', 'a'}

Why are these different in their results?

boB Stepp


More information about the Tutor mailing list