Python sort() 的陷阱:避免常見的錯誤

更新日期: 2025 年 2 月 5 日

在 Python 中,排序是一個常見的操作,而 sort()sorted() 是兩個主要的排序方法。

然而,許多初學者常常因為 sort() 的特性而寫出意外的錯誤,導致程式行為不符合預期。

例如,有些人誤以為 sort() 會返回排序後的列表,但實際上它只會改變原列表,並回傳 None

這篇文章將詳細解析 sort() 的行為,並比較 sort()sorted() 的差異,幫助你更正確地使用它們。


sort()sorted() 的差異

Python 提供了兩種排序方法:

  1. list.sort():直接對原列表進行排序(就地排序,in-place sorting),不會返回新的列表,而是返回 None
  2. 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() 的行為,能夠幫助你避免常見的陷阱,使你的程式碼更穩定、可讀性更高。

Similar Posts