为什么“;return list.sort()”;返回None,不是列表?

我已经能够验证findUniqueWords确实会导致一个排序的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
309002 次浏览

list.sort对列表进行排序,即它不会返回一个新的列表。只写

newList.sort()
return newList

问题就在这里:

answer = newList.sort()

sort不返回已排序的列表;相反,它对列表进行了适当的排序。

使用:

answer = sorted(newList)

Python习惯性地从改变数据的函数和方法中返回None,例如list.sortlist.appendrandom.shuffle,其思想是它暗示了它正在改变的事实。

如果你想接受一个可迭代对象,并返回一个新的、排序的可迭代对象项列表,可以使用sorted内置函数。

Python开发列表中Guido van Rossum的这是一封电子邮件解释了为什么他选择在影响对象的操作上不返回self,并且不返回一个新操作。

这来自于一种编码风格(在各种其他语言中流行,I 相信Lisp尤其沉迷于此),其中有一系列的副作用 在单个对象上可以这样链接:

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

哪个是一样的

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

我发现链接形式对可读性有威胁;它要求 读者必须非常熟悉每一种方法。的 第二种形式清楚地表明,这些调用的作用是相同的 对象,所以即使你不太了解类和它的方法 您可以理解,第二个和第三个调用应用于 X(并且所有的调用都是为了它们的副作用),而不是 别的东西。< / p > 我想为返回新值的操作保留链接, 类似字符串处理操作:

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

Python有两种sort: sort 方法(或“成员函数”)和sort 函数。sort方法对命名对象的内容进行操作——可以把它看作对象对自身进行重新排序的操作。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]

注意,返回值是 a 深拷贝,所以要像往常一样小心对列表中包含的元素进行副作用操作:

>>> 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()不返回任何值,而sort() 方法只是按特定顺序对给定列表中的元素进行排序——提升下行而不返回任何值。

所以问题是answer = newList.sort()的答案是none。

相反,你可以只做return newList.sort()

sort()方法的语法是:

list.sort(key=..., reverse=...)

或者,你也可以使用Python的内置函数sorted()来达到同样的目的。

sorted(list, key=..., reverse=...)

注意:sort()和sorted()之间最简单的区别是:sort()不返回任何值,而sorted()返回一个可迭代列表。

所以在你的例子中answer = sorted(newList)

你可以使用sorted()方法,如果你想让它返回排序的列表。

l1 = []
n = int(input())


for i in range(n):
user = int(input())
l1.append(user)
sorted(l1,reverse=True)

list.sort()方法就地修改列表并返回None。

如果你还想使用排序,你可以这样做。

l1 = []
n = int(input())


for i in range(n):
user = int(input())
l1.append(user)
l1.sort(reverse=True)
print(l1)

这是我在其他答案中没有看到的一个小智慧:

python中所有修改列表的可变对象的方法(如列表)都会返回None。因此,对于列表,这也包括list.append(), list.reverse()等。这就是为什么语法应该是

myList.sort()

同时,任何不可变对象(比如字符串)的方法都必须这样赋值:

myString = myString.strip()