Why does "return list.sort()" return None, not the list? [duplicate]
Почему "return list.sort()" возвращает None, а не список?
Я смог убедиться, что findUniqueWords действительно приводит к отсортированному list. Однако он не возвращает список. Почему?
deffindUniqueWords(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 notin newList: newList.append(word)
answer = newList.sort() return answer
Переведено автоматически
Ответ 1
list.sort сортирует список на месте, т. Е. Не возвращает новый список. Просто напишите
newList.sort() return newList
Ответ 2
Проблема здесь:
answer = newList.sort()
sort не возвращает отсортированный список; скорее, он сортирует список на месте.
Использование:
answer = sorted(newList)
Ответ 3
Вот электронное письмо от Гвидо ван Россума из списка разработчиков Python, объясняющее, почему он решил не возвращать self при операциях, которые влияют на объект, и не возвращать новый.
Это происходит из стиля кодирования (популярного в различных других языках, я полагаю, особенно им пользуется Lisp), где ряд побочных эффектов для одного объекта может быть связан следующим образом:
x.compress().chop(y).sort(z)
что было бы то же самое, что
x.compress() x.chop(y) x.sort(z)
Я считаю, что форма цепочки угрожает удобочитаемости; это требует, чтобы читатель должен быть хорошо знаком с каждым из методов. Вторая форма дает понять, что каждый из этих вызовов воздействует на один и тот же объект, и поэтому, даже если вы не очень хорошо знаете класс и его методы , вы можете понять, что второй и третий вызовы применяются к одному и тому же объекту. x (и что все вызовы выполняются для их побочных эффектов), а не для чего-то еще. что-то еще.
Я хотел бы зарезервировать цепочку для операций, которые возвращают новые значения, таких как операции обработки строк:
y = x.rstrip("\n").split(":").lower()
Ответ 4
В 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]
Имейте в виду, что возвращаемое значение не является глубокой копией, поэтому будьте осторожны с побочными операциями над элементами, содержащимися в списке, как обычно: