O Python possui dois tipos de classificação: um método de classificação (ou "função de membro") e uma função de classificação . O método de classificação opera no conteúdo do objeto nomeado - pense nele como uma ação que o objeto está executando para se reordenar . A função de classificação é uma operação sobre os dados representados por um objeto e retorna um novo objeto com o mesmo conteúdo em uma ordem classificada.
Dada uma lista de números inteiros nomeados, l
a própria lista será reordenada se chamarmos l.sort()
:
>>> l = [1, 5, 2341, 467, 213, 123]
>>> l.sort()
>>> l
[1, 5, 123, 213, 467, 2341]
Este método não tem valor de retorno. Mas e se tentarmos atribuir o resultado l.sort()
?
>>> l = [1, 5, 2341, 467, 213, 123]
>>> r = l.sort()
>>> print(r)
None
r
agora é igual a nada. Esta é uma daquelas estranhas detalhes, um pouco irritante que um programador é provável que esquecer depois de um período de ausência do Python (que é por isso que eu estou escrevendo isso, então eu não se esqueça de novo).
A função sorted()
, por outro lado, não fará nada com o conteúdo de l
, mas retornará uma nova lista classificada com o mesmo conteúdo que 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]
Esteja ciente de que o valor retornado não é uma cópia detalhada; portanto, tenha cuidado com operações com efeitos colaterais sobre os elementos contidos na lista, como de costume:
>>> 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]]