为什么"return list.sort()"返回None,而不是列表?

Lee*_*Str 126 python sorting return list

我已经能够验证findUniqueWords确实导致排序list.然而,它没有findUniqueWordslist,为什么呢?

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
Run Code Online (Sandbox Code Playgroud)

Ism*_*awi 155

list.sort对列表进行排序,即它不返回新列表.写吧

newList.sort()
return newList
Run Code Online (Sandbox Code Playgroud)

  • `return sorted(newList)` 更短。由于变量是本地变量,因此在此处无关紧要,但在某些情况下,就地排序可能会更改共享变量。 (14认同)
  • **为什么**是这样设计的`sort`功能?如果返回排序列表而不是None,是否存在任何性能开销或其他缺点? (3认同)
  • @LeiYang:小测验:如果我执行`b = a.sort()`,然后执行`b.pop()`,对`a`有什么影响?在某些语言中,“.sort”返回已排序的“a”的副本,在其他语言中,它就地排序并返回对“a”的引用。Python 通过就地突变返回“None”(而不是调用它们的别名)来消除歧义,因此减少了混乱。如果需要副本,可以使用“sorted”(它适用于所有可迭代对象,而不仅仅是“list”,始终按排序顺序返回“list”)。`alist.sort()` 返回 `alist` 的性能开销大约为零,只是不确定性。 (3认同)
  • 我还面临以下问题:`print(newList.sort())`给出了`None`。然而,当我这样做时,“newList.sort()”然后“print(newList)”它起作用了。 (2认同)

NPE*_*NPE 121

问题出在这里:

answer = newList.sort()
Run Code Online (Sandbox Code Playgroud)

sort不返回排序列表; 相反,它将列表排序到位.

使用:

answer = sorted(newList)
Run Code Online (Sandbox Code Playgroud)

  • 这就是大多数需求:list.sort()和sorted(list)之间的区别。 (3认同)

Gon*_*lde 57

是来自Guido van Rossum的电子邮件,在python的开发列表中解释为什么他选择不返回self影响对象的操作而不返回新的操作.

这来自于一种编码风格(在其他各种语言中很流行,我相信Lisp特别喜欢它),其中对单个对象的一系列副作用可以链接如下:

 x.compress().chop(y).sort(z)
Run Code Online (Sandbox Code Playgroud)

这将是相同的

  x.compress()
  x.chop(y)
  x.sort(z)
Run Code Online (Sandbox Code Playgroud)

我发现链接形式对可读性构成威胁; 它要求读者必须非常熟悉每种方法.第二种形式清楚地表明这些调用中的每一个都作用于同一个对象,因此即使您不熟悉该类及其方法,您也可以理解第二个和第三个调用应用于x(并且所有的电话都是为了他们的副作用而做的,而不是其他的.

我想为返回新值的操作保留链接,比如字符串处理操作:

 y = x.rstrip("\n").split(":").lower()
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,`split(":").lower()`是一个坏链,因为`split`返回一个没有`lower`方法的列表. (32认同)

zxq*_*xq9 13

Python有两种排序:排序方法(或"成员函数")和排序函数.sort方法对名为的对象的内容进行操作 - 将其视为对象重新排序的动作.sort函数是对对象表示的数据操作,并按排序顺序返回具有相同内容的新对象.

给定一个名为整数l的列表,如果我们调用,列表本身将被重新排序l.sort():

>>> l = [1, 5, 2341, 467, 213, 123]
>>> l.sort()
>>> l
[1, 5, 123, 213, 467, 2341]
Run Code Online (Sandbox Code Playgroud)

此方法没有返回值.但是,如果我们尝试分配结果l.sort()呢?

>>> l = [1, 5, 2341, 467, 213, 123]
>>> r = l.sort()
>>> print(r)
None
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

请注意,返回的值是不是一个深拷贝,所以要谨慎了包含列表照常中的元素侧effecty操作:

>>> 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]]
Run Code Online (Sandbox Code Playgroud)


Mik*_*ham 12

Python的习惯性地返回None从功能和变异数据的方法,比如list.sort,list.appendrandom.shuffle,与想法是,它暗示一个事实,即它是变异.

如果要获取iterable并返回其项的新排序列表,请使用sortedbuiltin函数.


dou*_*lix 10

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

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

myList.sort()

同时,任何不可变对象(如字符串)的方法必须像这样分配:

myString = myString.strip()


Pro*_*mik 9

要了解为什么它不返回列表:

sort() 不返回任何值,而 sort()方法只是按特定顺序对给定列表的元素进行排序 -升序降序,而不返回任何值。

所以问题是answer = newList.sort()没有答案。

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

sort() 方法的语法是:

list.sort(key=..., reverse=...)
Run Code Online (Sandbox Code Playgroud)

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

sorted(list, key=..., reverse=...)
Run Code Online (Sandbox Code Playgroud)

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

所以在你的情况下answer = sorted(newList)

  • > 相反,你可以只返回 newList.sort()……这是误导性的。它将返回 None 而不是排序列表。所以,是的,你可以做到,但可能不会做预期的事情。 (2认同)