Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Why doesn't python's list append() method return the list itself?

Reply
Thread Tools

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

 
 
dhruvbird
Guest
Posts: n/a
 
      07-11-2010
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,
but that rules out constructs like:
([1,2,3,4].reverse()+[[]]).reverse()
I want to prepend an empty list to [1,2,3,4]. This is just a toy
example, since I can always do that with [[]]+[1,2,3,4].

Regards,
-Dhruv.
 
Reply With Quote
 
 
 
 
Thomas Jollans
Guest
Posts: n/a
 
      07-11-2010
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]) + [[]])

(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.


Cheers

Thomas
 
Reply With Quote
 
 
 
 
Thomas Jollans
Guest
Posts: n/a
 
      07-11-2010
On 07/11/2010 06:28 PM, Nathan Rice wrote:
> Do list(reversed(list(reversed([1, 2, 3, 4])) + [[]]))
>
> Though TBH sometimes get annoyed at this behavior myself. There are a
> lot of people who are very vocal in support of returning none, and it
> makes sense in some ways. Since reversed returns an iterator though, it
> makes this code horrible and unreadable.
>


ah yes, forgot about that nuance. casting reversed to list. Still, there
is slicing.
 
Reply With Quote
 
Antoine Pitrou
Guest
Posts: n/a
 
      07-11-2010
On Sun, 11 Jul 2010 08:59:06 -0700 (PDT)
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,
> but that rules out constructs like:
> ([1,2,3,4].reverse()+[[]]).reverse()
> I want to prepend an empty list to [1,2,3,4]. This is just a toy
> example, since I can always do that with [[]]+[1,2,3,4].


>>> x = [1,2,3,4]
>>> y = [5,6]
>>> x[:0] = y
>>> x

[5, 6, 1, 2, 3, 4]



 
Reply With Quote
 
MRAB
Guest
Posts: n/a
 
      07-11-2010
Thomas Jollans 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()
>

[snip]
If you want to prepend an empty list in-place, use the .insert method:

L = [1,2,3,4]
L.insert(0, [])
 
Reply With Quote
 
dhruvbird
Guest
Posts: n/a
 
      07-11-2010
On Jul 11, 9:19*pm, Thomas Jollans <tho...@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.
 
Reply With Quote
 
News123
Guest
Posts: n/a
 
      07-12-2010
dhruvbird wrote:

>
> 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]



dy you mean
x.extend([1,2,3])

?
 
Reply With Quote
 
Raymond Hettinger
Guest
Posts: n/a
 
      07-12-2010
On Jul 11, 8:59*am, dhruvbird <dhruvb...@gmail.com> wrote:
> Why doesn't python's list append() method return the list itself? For
> that matter, even the reverse() and sort() methods?


Because Guido thinks that having those methods return None is the best
way to communicate that the underlying object has been mutated in-
place.

Some other languages do it differently, but this is Guido's language,
so we do it his way.


Raymond
 
Reply With Quote
 
Stephen Hansen
Guest
Posts: n/a
 
      07-12-2010
On 7/11/10 10:03 PM, Nathan Rice wrote:
> Yeah, I long ago filed the in place place in the same folder as
> strings-as-sequences, all() returning True for an empty iterable and any
> returning True rather than the thing which triggered it.


You know, the latter two I can see an argument for, and could see the
usefulness therein -- though I've never used either like that, but I
consider that chance. I could see the use (and could readily write my
own all/any in such a case, then keep it in my toolbox).

But the first: what?!

for ch in data:

is exceptionally useful. Strings-as-sequences I've used hundreds,
thousands of times. I use it constantly.

--

Stephen Hansen
... Also: Ixokai
... Mail: me+list/python (AT) ixokai (DOT) io
... Blog: http://meh.ixokai.io/


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.10 (Darwin)

iQEcBAEBAgAGBQJMOqO/AAoJEKcbwptVWx/l5JAIAKbwN8lf7BeNRZw6O2Ipy8Nb
StvFHOuWSnSBjuRacr6Zr9ARY8BGIbMH3hBQrWXzYtqDrIhv1Z RvntjeqcJkByEj
DRBAzka6ZtxIVeBmpYlmd+IPNEiZhhGLSRjd8W0eeCUKHTlYWC 4GPx/CeU6mAPPy
3szrc6YvWMSm1YK9G6j7Rt4pLfkmnHkn6MObmGZYTUzLpnoKzG 2DNctWamkDwdyM
xNd5mbW8g85xKxWT1GRG6c2M58yP1LJlsra+KlwMWqGtQ8EVxL Br5uQX6gotVvkl
B5EV2btshgULmhtGwxX0PB7G7Uk3JVJK91OWPbL5T1m1X5XqSw Av2BctTuqSaZ4=
=thSD
-----END PGP SIGNATURE-----

 
Reply With Quote
 
Chris Rebert
Guest
Posts: n/a
 
      07-12-2010
On Sun, Jul 11, 2010 at 10:03 PM, Nathan Rice
<> wrote:
> Yeah, I long ago filed the in place place in the same folder as

<snip>
> all() returning True for an empty iterable


If you weren't taught about vacuous truth (or even identity elements)
in Discrete Mathematics, someone fscked up. Said behavior is the
absolute correct behavior from a formal logic standpoint.

Cheers,
Chris
--
http://blog.rebertia.com
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Why does list.__getitem__ return a list instance for subclasses ofthe list type? dackz Python 0 02-06-2007 04:44 PM
why why why why why Mr. SweatyFinger ASP .Net 4 12-21-2006 01:15 PM
findcontrol("PlaceHolderPrice") why why why why why why why why why why why Mr. SweatyFinger ASP .Net 2 12-02-2006 03:46 PM
Carriage Return added during return of large string from class method Xeno Campanoli Ruby 0 02-13-2006 08:39 PM
what value does lack of return or empty "return;" return Greenhorn C Programming 15 03-06-2005 08:19 PM



Advertisments