Почему «return list.sort ()» возвращает None, а не список?

Я смог проверить, что findUniqueWords приводит к сортированному list . Однако, он не return list , почему?

 def findUniqueWords(theList): newList = [] words = [] # Read a line at a time for item in theList: # Remove any punctuation from the line cleaned = cleanUp(item) # Split the line into separate words words = cleaned.split() # Evaluate each word for word in words: # Count each unique word if word not in newList: newList.append(word) answer = newList.sort() return answer 

6 Solutions collect form web for “Почему «return list.sort ()» возвращает None, а не список?”

list.sort сортирует список на месте, т. е. он не возвращает новый список. Просто пиши

 newList.sort() return newList 

Проблема здесь:

 answer = newList.sort() 

sort не возвращает отсортированный список; скорее, он сортирует список на месте.

Использование:

 answer = sorted(newList) 

Вот письмо от Guido van Rossum в списке разработчиков python, объясняющее, почему он не хочет возвращать self на операции, которые влияют на объект и не возвращают новый.

Это происходит из стиля кодирования (популярного на разных других языках, я считаю, в частности, Lisp), где ряд побочных эффектов на одном объекте можно связать следующим образом:

  x.compress().chop(y).sort(z) 

который будет таким же, как

  x.compress() x.chop(y) x.sort(z) 

Я считаю, что цепочка создает угрозу читаемости; это требует, чтобы читатель был глубоко знаком с каждым из методов. Вторая форма дает понять, что каждый из этих вызовов действует на один и тот же объект, поэтому даже если вы не знаете класс и его методы очень хорошо, вы можете понять, что второй и третий вызов применяются к x (и что все вызовы сделаны для их побочных эффектов), а не что-то еще.

Я хотел бы зарезервировать цепочку для операций, возвращающих новые значения, например операции обработки строк:

  y = x.rstrip("\n").split(":").lower() 

Python обычно возвращает None из функций и методов, которые мутируют данные, такие как list.sort , list.append и random.shuffle , при этом идея заключается в том, что он намекает на то, что он мутировал.

Если вы хотите выполнить итерацию и вернуть новый, отсортированный список своих элементов, используйте sorted встроенную функцию.

Python имеет два типа видов: метод сортировки (или «функция-член») и функцию сортировки. Метод sort работает над содержимым объекта с именем – считайте его как действие, которое объект берет для переупорядочения . Функция сортировки – это операция над данными, представленными объектом, и возвращает новый объект с тем же содержимым в отсортированном порядке.

Учитывая список целых чисел с именем l сам список будет переупорядочен, если мы назовем l.sort() :

 >>> l = [1, 5, 2341, 467, 213, 123] >>> l.sort() >>> l [1, 5, 123, 213, 467, 2341] 

Этот метод не имеет возвращаемого значения. Но что, если мы попытаемся присвоить результат l.sort() ?

 >>> l = [1, 5, 2341, 467, 213, 123] >>> r = l.sort() >>> print(r) None 

r сейчас фактически ничего не значит. Это одна из тех странных, несколько досадных деталей, которые программист, вероятно, забудет после периода отсутствия на Python (вот почему я пишу это, поэтому я не забываю снова).

Функция sorted() , с другой стороны, ничего не сделает с содержимым l , но вернет новый отсортированный список с тем же содержимым, что и 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] 

Имейте в виду, что возвращаемое значение не является глубокой копией , поэтому будьте осторожны в отношении побочных действий над элементами, содержащимися в списке, как обычно:

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

Перечитайте документацию для функции sort Python, сосредоточив внимание на ее возвращаемом значении.

  • Python - ускорить создание перестановок списка (и процесс проверки, если перестановки в Dict)
  • Преобразование списка в * args в Python
  • Присоедините список списков вместе в один список в Python
  • Нарезка списка с использованием переменной в Python
  • Скопировать последние три строки текстового файла в python?
  • Итерирование пустого списка в списке - python
  • Как клонировать или копировать список?
  • Могу ли я включить один элемент в список без инструкции else в python?
  • Python - лучший язык программирования в мире.