Why doesn't python's list append() method return the list itself?

dhruvbird dhruvbird at gmail.com
Sun Jul 11 14:07:46 EDT 2010


On Jul 11, 9:19 pm, Thomas Jollans <tho... at jollans.com> wrote:
> On 07/11/2010 05:59 PM, dhruvbird wrote:
>
> > Why doesn't python's list append() method return the list itself? For
> > that matter, even the reverse() and sort() methods?
> > I found this link (http://code.google.com/edu/languages/google-python-
> > class/lists.html) which suggests that this is done to make sure that
> > the programmer understands that the list is being modified in place,
>
> Yes!
>
> > but that rules out constructs like:
> > ([1,2,3,4].reverse()+[[]]).reverse()
>
> No!
>
> you can either approach this by imperatively modifying a list in-place:
>
> L = [1,2,3,4]
> L.reverse()
> L.append([])
> L.reverse()
>
> Or you can use a more functional style:
>
> L2 = reversed(reversed([1,2,3,4]) + [[]])

Okay, but this assumes that I have reversed/sorted/etc... type of
functions for all member functions that mutate the container.
Also, as Nathan mentioned, reversed returns an iterator, whereas
sorted returns a list. This asymmertic behaviour is a bit unnerving.

>
> (or ([1,2,3,4][::-1]+[[]])[::-1], if you like that kind of thing)
>
> Imagine list.reverse and list.append *did* return self:
>
> L1 = [1,2,3,4]
> L2 = L1.reverse().append([]).reverse()
>
> would you expect, after this code, that (L1 == L2) and (L1 is L2)? I
> think it would surprise a lot of people. Better clearly separate
> modifying an object and functionally processing an object.

I think this is a fair call. Honestly, I wouldn't expect them to be
the same.

However, there are cases when I want to be able to write down my
intent in one line.
Much like f(g(h(x))).

On a side note, is there any other way to append to a list using
slices (apart from the one below):
x[len(x):len(x)] = [item to append]

And while we are talking about python here, why does this statement:
y = x[:0] = [100] behave the way it does?
I mean everything except for the last value is assigned to the last
value rather than the assignments following the chain and every item
getting its succeeding item's reference?

Regards,
-Dhruv.



More information about the Python-list mailing list