sort и sorted в Python делают одно — упорядочивают элементы, — но ведут себя по-разному. .sort() — это метод списка: он меняет список на месте и возвращает None. sorted() — функция: она не трогает оригинал, а возвращает новый отсортированный список. Разберём разницу и частую ловушку.
Коротко
items.sort() сортирует сам список и возвращает None — присваивать результат не нужно. sorted(items) оставляет оригинал нетронутым и отдаёт новый отсортированный список — его как раз нужно сохранить. Нужен оригинал дальше — бери sorted(), не нужен — можно .sort().
# .sort() — на месте
a = [3, 1, 2]
a.sort()
print(a)
# sorted() — новый список, оригинал цел
b = [3, 1, 2]
new = sorted(b)
print(new)
print(b)[1, 2, 3] [1, 2, 3] [3, 1, 2]
a.sort() переставил элементы прямо в a. sorted(b) создал новый список new, а b остался в исходном порядке. Про списки и их методы — в гайде Списки в Python: создание, методы и срезы.
sort vs sorted в Python: сравнение в одной таблице
| Критерий | items.sort() | sorted(items) |
|---|---|---|
| Где доступен | В стандартных типах Python — у list | Для любого перебираемого объекта |
| Меняет исходный объект | Да | Нет |
| Что возвращает | None | Новый список |
| Второй список с результатом | Не создаёт | Создаёт |
| Параметры key и reverse | Поддерживает | Поддерживает |
Когда что использовать
Бери sorted(), когда исходный порядок ещё понадобится или когда сортируешь не список, а другой перебираемый объект. Бери .sort(), когда оригинал больше не нужен и не хочется создавать второй список с результатом. В большинстве обычных случаев итоговый порядок элементов получится одинаковым — выбор зависит от того, нужен ли исходный список дальше.
Параметры key и reverse работают одинаково
Оба инструмента принимают параметр key, который указывает, по какому признаку сравнивать элементы, и reverse=True для обратного порядка. Разница остаётся прежней: .sort() меняет список, а sorted() создаёт новый.
names = ["Алексей", "Ян", "Мария"]
short_first = sorted(names, key=len)
print(short_first)
print(names)
names.sort(key=len, reverse=True)
print(names)['Ян', 'Мария', 'Алексей'] ['Алексей', 'Ян', 'Мария'] ['Алексей', 'Мария', 'Ян']
key=len сортирует строки по длине. Сначала sorted() создал отдельный список short_first, поэтому исходный names сохранил порядок. Затем .sort() перестроил уже сам names, а reverse=True расположил строки от самой длинной к самой короткой.
Что sorted возвращает для других объектов?
sorted() принимает любой перебираемый объект, но результат всегда один и тот же по типу — новый список. Для строки это список символов, для кортежа — список его элементов, а для словаря — список отсортированных ключей.
print(sorted("cab"))
print(sorted((3, 1, 2)))
print(sorted({"b": 2, "a": 1}))['a', 'b', 'c'] [1, 2, 3] ['a', 'b']
У .sort() то же поведение, что у .append() и .reverse(): эти методы меняют список на месте и возвращают None. Но это не универсальное правило для всех изменяющих методов — например, .pop() меняет список и возвращает удалённый элемент. Изменяемые и неизменяемые типы подробно разобраны в гайде Типы данных в Python: полный гайд для начинающих.
Короткие ответы на вопросы
В чём разница sort и sorted?
.sort() — метод, сортирует список на месте и возвращает None. sorted() — функция, возвращает новый отсортированный список, не меняя оригинал.
Почему после a = a.sort() список стал None?
Потому что .sort() возвращает None, а не список. Правильно: либо a.sort() без присваивания, либо a = sorted(a).
Можно ли применить sorted к строке или словарю?
Да. Для строки sorted() вернёт список символов, а для словаря — список отсортированных ключей. Встроенный метод list.sort() предназначен именно для списков.
Кот-наставник— Простое правило:
.sort()меняет список и отдаётNone,sorted()не трогает оригинал и отдаёт новый список.— И не пиши
a = a.sort()— получишьNone. Нужен результат отдельно — бериsorted().
Сортировка списков — на практике
На SkillPy ты сортируешь списки сам, а AI-наставник ловит момент, когда .sort() вернул None, и объясняет, где нужен sorted(). Он понимает твой код, а не сверяет с шаблоном.
