Python sort() 的陷阱:避免常見的錯誤
更新日期: 2025 年 2 月 5 日
在 Python 中,排序是一個常見的操作,而 sort() 和 sorted() 是兩個主要的排序方法。
然而,許多初學者常常因為 sort() 的特性而寫出意外的錯誤,導致程式行為不符合預期。
例如,有些人誤以為 sort() 會返回排序後的列表,但實際上它只會改變原列表,並回傳 None。
這篇文章將詳細解析 sort() 的行為,並比較 sort() 與 sorted() 的差異,幫助你更正確地使用它們。
sort() 和 sorted() 的差異
Python 提供了兩種排序方法:
list.sort():直接對原列表進行排序(就地排序,in-place sorting),不會返回新的列表,而是返回None。sorted(list):返回一個新的排序後的列表,不會改變原列表。
這兩種方法的主要差異如下:
| 方法 | 是否改變原列表 | 返回值 |
|---|---|---|
| list.sort() | ✅ 會改變 | ❌ None |
| sorted(list) | ❌ 不改變 | ✅ 新的排序後列表 |
這些特性影響了函式的設計方式,讓我們看看實際的例子。
sort() 的使用陷阱
錯誤示範:直接返回 sort() 的結果
def sort_and_return(arr):
return arr.sort() # .sort() 會修改 arr,但回傳 None
print(sort_and_return([3, 1, 4, 1, 5])) # 輸出: None
錯誤原因
arr.sort()會修改arr,但不會回傳排序後的列表,只會回傳None。return arr.sort()等價於return None,導致函式的輸出不是我們預期的排序結果。
正確示範:先排序,再回傳列表
如果我們希望返回排序後的列表,可以這樣寫:
def sort_and_return(arr):
arr.sort() # 先進行排序
return arr # 回傳修改後的列表
print(sort_and_return([3, 1, 4, 1, 5])) # 輸出: [1, 1, 3, 4, 5]
正確原因
arr.sort()會對arr進行排序。return arr確保回傳的是排序後的列表,而不是None。
如果不想修改原列表,應該使用 sorted()
有時候,我們不想改變原始的列表,而只是想要獲得排序後的新列表,這時候應該使用 sorted():
def get_sorted_list(arr):
return sorted(arr) # 產生新的排序後列表
arr = [3, 1, 4, 1, 5]
print(get_sorted_list(arr)) # 輸出: [1, 1, 3, 4, 5]
print(arr) # arr 仍然是 [3, 1, 4, 1, 5],沒有被改變
為什麼要用 sorted()?
sorted(arr)不會修改原列表,而是返回一個新的排序後列表。- 這對於需要保留原始資料的場合特別有用。
sort() 的正確應用場景
雖然 sort() 會改變原列表,但在某些情境下,它仍然是合適的選擇:
- 當你確定不需要原始順序時,例如:
numbers = [5, 2, 9, 1, 5, 6] numbers.sort() print(numbers) # [1, 2, 5, 5, 6, 9] - 當列表很大時,
sort()可能比sorted()更有效率,因為它不需要額外分配記憶體來存儲新的列表。
總結
| 方法 | 是否改變原列表 | 返回值 | 適用情境 |
|---|---|---|---|
| list.sort() | ✅ 會改變 | ❌ None | 當不需要保留原列表時 |
| sorted(list) | ❌ 不改變 | ✅ 新的排序後列表 | 當需要保留原列表時 |
你應該怎麼做?
- 如果你希望修改原列表並返回排序後的結果:
def sort_and_return(arr): arr.sort() return arr - 如果你不想修改原列表,而只是想要一個新的排序後的列表:
def get_sorted_list(arr): return sorted(arr)
理解 sort() 的行為,能夠幫助你避免常見的陷阱,使你的程式碼更穩定、可讀性更高。
