Python ha due tipi di ordinamenti: un metodo di ordinamento (o "funzione membro") e una funzione di ordinamento . Il metodo di ordinamento opera sul contenuto dell'oggetto denominato: pensalo come un'azione che l'oggetto sta eseguendo per riordinare se stesso . La funzione di ordinamento è un'operazione sui dati rappresentati da un oggetto e restituisce un nuovo oggetto con lo stesso contenuto in un ordine ordinato.
Dato un elenco di numeri interi chiamati l
l'elenco stesso verrà riordinato se chiamiamo l.sort()
:
>>> l = [1, 5, 2341, 467, 213, 123]
>>> l.sort()
>>> l
[1, 5, 123, 213, 467, 2341]
Questo metodo non ha valore di ritorno. E se provassimo ad assegnare il risultato di l.sort()
?
>>> l = [1, 5, 2341, 467, 213, 123]
>>> r = l.sort()
>>> print(r)
None
r
ora non equivale a nulla. Questo è uno di quei strani, un po 'fastidiosi dettagli che un programmatore è probabile a dimenticare dopo un periodo di assenza dal Python (che è il motivo per cui sto scrivendo questo, quindi io non dimentico di nuovo).
La funzione sorted()
, d'altra parte, non farà nulla al contenuto di l
, ma restituirà un nuovo elenco ordinato con gli stessi contenuti di l
:
>>> l = [1, 5, 2341, 467, 213, 123]
>>> r = sorted(l)
>>> l
[1, 5, 2341, 467, 213, 123]
>>> r
[1, 5, 123, 213, 467, 2341]
Tieni presente che il valore restituito non è una copia approfondita , quindi fai attenzione alle operazioni con effetti collaterali sugli elementi contenuti nell'elenco come al solito:
>>> spam = [8, 2, 4, 7]
>>> eggs = [3, 1, 4, 5]
>>> l = [spam, eggs]
>>> r = sorted(l)
>>> l
[[8, 2, 4, 7], [3, 1, 4, 5]]
>>> r
[[3, 1, 4, 5], [8, 2, 4, 7]]
>>> spam.sort()
>>> eggs.sort()
>>> l
[[2, 4, 7, 8], [1, 3, 4, 5]]
>>> r
[[1, 3, 4, 5], [2, 4, 7, 8]]