為什麼 Python 中列表的 sort 方法一定要返回 None 而不是排序後的列表?

感覺返回None簡直反人類嘛,讓多少人義無反顧的跳進這個坑中了

sorted無關 就是問返回排序後的列表不是更方便么


一般來說,返回 None 表示是在原對象上進行的操作。返回排序後結果意味著創建了一個副本。

如果你需要返回排序後的,可以使用 sorted 函數。我感覺題主需要的其實是 sorted 函數而非 sort。


這是個好問題,坑過不少人。

1. 從設計角度來說,因為 Command-query separation

Command-query separation states that every method should either be a command that performs an action, or a query that returns data to the caller, but not both. In other words, asking a question should not change the answer. More formally, methods should return a value only if they are referentially transparent and hence possess no side effects.

也就是說只有引用透明,也就是沒有副作用的函數,才應該具有返回值。

x.sort(),很明顯,改變了 x 的值,具有副作用,所以不應該有返回值。

2.從易讀性角度來說, Guido van Rossum 在 Python-Dev 郵件列表裡也解釋過為什麼選擇將 x.sort() 的返回值定為 None. (郵件原文:[Python-Dev] sort() return value)

3. 從性能和易用性角度來說,Python Doc 解釋了為什麼要這樣設計(Design and History FAQ- List sort)。

In situations where performance matters, making a copy of the list just to sort it would be wasteful. Therefore, list.sort() sorts the list in place. In order to remind you of that fact, it does not return the sorted list. This way, you won』t be fooled into accidentally overwriting a list when you need a sorted copy but also need to keep the unsorted version around.


這並不反人類。

一門編程語言提供了一個sort函數的時候,作為使用者第一個應該問的問題是:這個函數是in-place的還是返回一個新object。Python的sort是in-place的,那麼排序完成後的列表就沒有返回的必要了,當然返回None是最正確的做法,有什麼坑可言?


sorted函數和list的sort方法是不一樣的

舉個簡單的例子,dog是一個對象,那dog.bark()應該返回什麼?叫完了不就完了嘛,還返回啥。

但是如果有一個函數mated,那mated(dog)應該返回什麼?日過的狗,mated_dog。

list.sort()是該list自身調用,list將自身(self)排序(sort)一下,自身(self)發生了改變,而排序這個動作本身是不需要返回什麼的,再例如I.eat(apple),難道這個eat還需要返回一個我嗎?

而sorted這個函數,是將傳入的對象排序返回,這個函數沒有什麼自身的存在,所以不返回點什麼東西,那就沒意義了。

總之,這個問題屬於面向對象的程序設計,不要用函數式編程的思維硬套。

PS: 以上都是我胡說的,我根本不懂什麼面向對象,函數式。


python 還有一個sorted函數


所以list.sort() == sorted(list)是False


因為當你需要它返回數組時,你寫錯了。

在你寫錯的時候可以提醒你,這就是返回空的作用。


讓多少人義無反顧地跳坑了?呵呵沒多少。


推薦閱讀:

已有C++基礎,python入門書籍推薦?
在windows7中python3.4下如何升級pip?
Python是最好的編程語言嗎?
python buildin 中的一些類中為什麼方法的內容都是pass?
Python多重繼承是否始終是遵循從左到右 深度優先的規則?

TAG:程序員 | 編程語言 | Python |