История вопроса:
Метод sort() встроен в тип list с первых версий Python, а функция sorted() появилась в Python 2.4. Сортировка коллекций — одна из самых частых задач в программировании, и Python предлагает два основных инструмента для её решения.
Проблема:
Многие начинающие путают sort() (метод списка) и sorted() (функцию высокого уровня). Нет понимания, когда использовать in-place сортировку, какие объекты можно сортировать, как задавать произвольный порядок через key/reverse, к каким возможным ловушкам это ведёт, особенно для сложных пользовательских структур.
Решение:
list.sort() сортирует оригинальный список на месте и возвращает None. Меняет исходный объект.sorted() возвращает новый отсортированный список (или другой тип, если передать иное), не изменяя оригинал. Работает с любыми итерируемыми объектами (даже с генераторами).key (функция сортировки) и reverse (логический флаг для сортировки в обратном порядке).Пример кода:
numbers = [5, 2, 9, 1] numbers.sort() # numbers = [1, 2, 5, 9] words = ['aaa', 'ZZZ', 'bbb'] sorted_words = sorted(words, key=str.lower, reverse=True) # sorted_words = ['ZZZ', 'bbb', 'aaa'] # words остаётся неизменным
Ключевые особенности:
sort() работает только для списков и сортирует in-place (на месте), sorted() универсальнее — работает с любым итерируемым объектом.Что вернёт переменная, если сделать my_list = my_list.sort()?
Ответ: my_list будет None, потому что sort сортирует список на месте и возвращает None. Это распространённый баг: всегда сортируйте in-place без присваивания, либо используйте sorted, если нужен отсортированный объект как новый список.
Пример кода:
lst = [3, 1, 2] lst = lst.sort() # lst теперь None
Можно ли отсортировать кортеж или строку методом sort()?
Ответ: Нет, у неизменяемых объектов (tuple, str) нет метода sort, но к ним применим sorted(), который возвращает новый отсортированный список из элементов.
Пример кода:
tpl = (4, 2, 7) sorted_tpl = sorted(tpl) # sorted_tpl = [2, 4, 7]
Можно ли отсортировать список с элементами разных типов?
Ответ: В Python 3 сортировка разных несравнимых типов (например, int и str) вызывает TypeError. В Python 2 был специфический порядок, сейчас требуется явно указать функцию key, чтобы обобщить все значения в сравнимую форму.
Негативный кейс
Программист сделал my_list = my_list.sort(), после чего утратил доступ к исходному списку, потому что переменной присвоено значение None.
Плюсы:
Минусы:
Позитивный кейс
Использовали аккуратное sorted() для получения новой версии без изменения оригинала либо корректно применили sort, не делая присваивания.
Плюсы:
Минусы: