[Tutor] Puzzled by print lst.sort()

Liam Clarke ml.cyresse at gmail.com
Sat Sep 30 14:07:42 CEST 2006


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 at python.org <mailto:Tutor at 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 at python.org
> http://mail.python.org/mailman/listinfo/tutor
>   



More information about the Tutor mailing list