Dick Moores wrote: > At 03:22 AM 9/30/2006, Liam Clarke wrote: >> Dick Moores wrote: >>> >>> >>> lst = [5,3,7,6,2] >>> >>> lst.sort() >>> >>> lst >>> [2, 3, 5, 6, 7] >>> >>> lst = [5,3,7,6,2] >>> >>> print lst.sort() >>> None >>> >>> lst >>> [2, 3, 5, 6, 7] >>> >>> I'm wondering why "print lst.sort()" doesn't print the newly >>> sorted >>> list, but instead prints "None". In fact, the sorting has taken >>> place >>> because of "print lst.sort()". Is this behavior a Good Thing in >>> Python? >>> >>> Dick >>> >>> _______________________________________________ >>> Tutor maillist - >>> Tutor@python.org <mailto:Tutor@python.org> >>> >>> http://mail.python.org/mailman/listinfo/tutor >>> >>> >> Hi Dick, >> >> A Python list sort is destructive, as you can see - it has modified >> lst. So, to emphasise that it is destructive, it returns None. You'll >> find this in most destructive methods and functions in Python. > > OK, but returning the new list would seem to make more sense. Is the > reason sort() doesn't, really only that it is better to emphasize that > it is destructive?
Hi Dick, According to the guy who runs Python, yup. Got to remember the downside to destructive functions is that everything in Python is a reference. For example: >>> a = [3,2,1] >>> b = a >>> b.sort() >>> print a [1, 2, 3] If you could use y = x.sort() to get a copy of the sorted list, you'd find that subtle bugs would appear and frustrate you. In functional languages like Common Lisp or Scheme, destructive functions are very clearly marked as such, (in Scheme, they use exclamation marks - (sort! x) to indicate a destructive version of (sort x).) as a key part of the functional paradigm is reducing side effects. I believe sorting in place has performance advantages too. It's covered in the official FAQ: http://www.python.org/doc/faq/general/#why-doesn-t-list-sort-return-the-sorted-list Regards, Liam Clarke >> However, as of Python 2.4, there's a new built-in function that has >> the functionality you want: >> >> >>> x = [3,1,2] >> >>> y = sorted(x) >> >>> print y >> [1, 2, 3] >> >>> print x >> [3, 1, 2] >> >> You'll note that sorted() is *not *destructive - that is, x is not >> modified. > > Didn't know about sorted(). Thanks, Liam. > > Dick > > > ------------------------------------------------------------------------ > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor