Чтобы перевернуть список в Python, есть три способа. Метод list.reverse() разворачивает список на месте и возвращает None. Функция reversed() отдаёт итератор в обратном порядке. Срез [::-1] создаёт новый перевёрнутый список, не трогая оригинал. Выбор зависит от того, нужен ли вам исходный список нетронутым.

my_list = [1, 2, 3, 4, 5] # 1. На месте: меняет оригинал, возвращает None my_list.reverse() print(my_list) # [5, 4, 3, 2, 1] # 2. Итератор: ничего не копирует до материализации print(list(reversed(my_list))) # [1, 2, 3, 4, 5] # 3. Срез: новый список, оригинал не меняется print(my_list[::-1]) # [1, 2, 3, 4, 5]

Три способа перевернуть список в Python

Разворот списка — базовая операция при обработке данных, работе с очередями и алгоритмах. Python предлагает три инструмента, и разница между ними принципиальна: одни меняют исходный объект, другие возвращают новый. Понимание этой разницы избавляет от труднонаходимых багов, когда переменная неожиданно оказывается изменённой.

Метод list.reverse() — разворот на месте

Метод reverse() изменяет список in-place: он переставляет элементы внутри того же объекта и возвращает None. Это его главная особенность и одновременно частый источник ошибок — присваивать результат нельзя.

data = [10, 20, 30] result = data.reverse() # ОШИБКА логики print(result) # None print(data) # [30, 20, 10] — оригинал уже изменён

Внутри метод меняет местами i-й и (n−i)-й элементы, выполняя примерно n/2 перестановок. Дополнительная память не выделяется, поэтому это самый экономный по памяти вариант.

Функция reversed() — ленивый итератор

Встроенная функция reversed() не разворачивает список и не создаёт его копию. Она возвращает итератор (list_reverseiterator), который отдаёт элементы в обратном порядке по мере обхода. Это идеально для циклов, где полный перевёрнутый список не нужен.

data = [1, 2, 3] for x in reversed(data): print(x) # 3, затем 2, затем 1 # Если нужен именно список — материализуйте итератор reversed_list = list(reversed(data)) print(reversed_list) # [3, 2, 1] print(data) # [1, 2, 3] — оригинал не тронут

Создание итератора почти мгновенно и не зависит от размера списка — расход памяти на сам итератор постоянный. Элементы вычисляются только при обходе.

Срез [::-1] — новый перевёрнутый список

Синтаксис среза [start:stop:step] с шагом -1 создаёт новый список, являющийся перевёрнутой копией. Оригинал остаётся неизменным. Это самый компактный по записи способ, когда нужен именно новый объект.

data = [1, 2, 3, 4, 5] reversed_copy = data[::-1] print(reversed_copy) # [5, 4, 3, 2, 1] print(data) # [1, 2, 3, 4, 5] — не изменён

Срез сразу выделяет новый список из n элементов, поэтому по памяти он дороже, чем reverse() или reversed(). Зато он читается однозначно и работает не только со списками, но и со строками и кортежами.

ОНЛАЙН-ПРАКТИКУМ
ЗАПУСК нейросети DEEPSEEK R1 ЛОКАЛЬНО НА СВОЕМ КОМПЬЮТЕРЕ
ЧТО БУДЕТ НА ОБУЧЕНИИ?
  • ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросети DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
  • Где и как применять? Потестируем модель после установки на разных задачах
  • Как дообучить модель под себя?

Сравнительная таблица методов реверса и сортировки

Как выбрать способ реверса: меняем оригинал или нужен новый объект
Как выбрать способ реверса: меняем оригинал или нужен новый объект

Ключевой вопрос при выборе инструмента: меняет ли он исходный объект (in-place) и что возвращает. Ниже сводка по всем встроенным способам.

Метод / приём Меняет оригинал (in-place)? Что возвращает
list.reverse() Да None
reversed(seq) Нет итератор (обратный обход)
seq[::-1] Нет новый список / строку / кортеж
list.sort() Да None
sorted(iterable) Нет новый отсортированный список

Правило простое: методы объекта (.reverse(), .sort()) работают на месте и возвращают None; встроенные функции (reversed(), sorted()) не трогают исходные данные и возвращают новый результат. Подробнее о самих структурах данных — в руководстве по работе со списками в Python.

Сортировка списка: sort() и sorted()

Симметрия Python: метод меняет на месте, функция возвращает новое
Симметрия Python: метод меняет на месте, функция возвращает новое

Сортировка упорядочивает элементы по возрастанию (по умолчанию) или убыванию. Как и с реверсом, есть метод, меняющий список на месте, и функция, возвращающая новый список.

Метод list.sort() — сортировка на месте

nums = [5, 3, 1, 4, 2] nums.sort() print(nums) # [1, 2, 3, 4, 5], метод вернул None nums.sort(reverse=True) print(nums) # [5, 4, 3, 2, 1]

Функция sorted() — новый отсортированный список

Функция sorted() принимает любой итерируемый объект (список, кортеж, строку, множество) и возвращает новый отсортированный список, не изменяя источник.

nums = [5, 3, 1, 4, 2] ordered = sorted(nums) print(ordered) # [1, 2, 3, 4, 5] print(nums) # [5, 3, 1, 4, 2] — не изменён print(sorted(nums, reverse=True)) # [5, 4, 3, 2, 1]

Параметры key и reverse

Аргумент reverse=True задаёт убывающий порядок. Аргумент key принимает функцию, по значению которой сравниваются элементы — так сортируют по длине, по полю словаря, без учёта регистра и т. д.

words = ["banana", "kiwi", "apple", "fig"] # По длине слова print(sorted(words, key=len)) # ['fig', 'kiwi', 'apple', 'banana'] # По алфавиту без учёта регистра, по убыванию print(sorted(words, key=str.lower, reverse=True)) # Сортировка словарей по полю users = [{"name": "Иван", "age": 30}, {"name": "Анна", "age": 25}] print(sorted(users, key=lambda u: u["age"]))

Сортировка в Python стабильна: элементы с равными ключами сохраняют относительный порядок. Это позволяет сортировать по нескольким критериям последовательными вызовами. Практический пример сортировки на уровне API — в статье про пагинацию и сортировку в FastAPI.

Реверс строк и кортежей

Строки и кортежи в Python неизменяемы (immutable), поэтому у них нет методов .reverse() или .sort(). Развернуть их можно срезом [::-1] или через reversed().

# Строка text = "Python" print(text[::-1]) # 'nohtyP' print("".join(reversed(text))) # 'nohtyP' # Кортеж t = (1, 2, 3, 4) print(t[::-1]) # (4, 3, 2, 1) print(tuple(reversed(t))) # (4, 3, 2, 1)

Для строк reversed() отдаёт итератор символов, который нужно собрать обратно через "".join(...). Разницу между изменяемыми списками и неизменяемыми кортежами разбираем отдельно в материале о списках и кортежах.

Сложность и производительность

Все три способа реверса линейны по времени — O(n), но отличаются по памяти и моменту вычисления:

  • list.reverse() — время O(n), память O(1). Работает на месте, ничего не копирует.
  • reversed() — создание итератора O(1), обход O(n). Память на итератор постоянна; список формируется только при list(...).
  • [::-1] — время O(n), память O(n): сразу выделяется новый список.

Сортировка (sort() и sorted()) использует алгоритм Timsort со сложностью O(n·log n). Практический вывод: если исходный список менять нельзя, берите reversed() для обхода и [::-1]/sorted() когда нужен новый объект; если оригинал не важен и важна память — reverse() и sort().

Комбинирование реверса и сортировки

Нередко нужно отсортировать список, а затем развернуть его. Убывающий порядок достигается напрямую параметром reverse=True — это чище, чем сортировать и потом отдельно разворачивать.

names = ["Alice", "Bob", "Charlie", "Dave"] # Два шага: сортировка + реверс на месте names.sort() names.reverse() print(names) # ['Dave', 'Charlie', 'Bob', 'Alice'] # Один шаг — предпочтительно print(sorted(names, reverse=True))

Официальное описание методов и параметров сортировки — в документации Python.

Частые ошибки

  • Присваивание результата in-place методов. x = my_list.reverse() запишет в x значение None, а не перевёрнутый список.
  • Ожидание списка от reversed(). Функция возвращает итератор — оберните его в list(), если нужен список.
  • Попытка вызвать .reverse() у строки или кортежа. Они неизменяемы; используйте срез [::-1].
  • Повторный обход итератора reversed(). Итератор исчерпывается после первого прохода — для второго обхода создайте его заново.

Часто задаваемые вопросы

Чем reversed() отличается от reverse()?

list.reverse() — метод, который меняет исходный список на месте и возвращает None. reversed() — встроенная функция, которая не меняет оригинал и возвращает итератор для обхода в обратном порядке.

Как перевернуть список, не меняя оригинал?

Используйте срез new = old[::-1] или new = list(reversed(old)). Оба варианта создают новый список, оставляя исходный нетронутым.

Почему my_list.reverse() возвращает None?

Потому что это операция на месте: она изменяет сам список, а по соглашению Python такие методы возвращают None. Результат уже находится в исходной переменной.

Как отсортировать список по убыванию?

Передайте reverse=True: my_list.sort(reverse=True) для изменения на месте или sorted(my_list, reverse=True) для нового списка.

Можно ли развернуть строку методом reverse()?

Нет, строки неизменяемы и не имеют метода reverse(). Разворачивайте строку срезом s[::-1] или через "".join(reversed(s)).

Заключение

Для реверса списка в Python выбирайте по задаче: reverse() — когда оригинал можно менять и важна память; reversed() — для обхода в обратном порядке без копирования; [::-1] — когда нужен новый перевёрнутый список, в том числе для строк и кортежей. Сортировка устроена симметрично: sort() меняет список на месте, sorted() возвращает новый. Разделение на «меняет оригинал / возвращает новый» — ключ к предсказуемому и безопасному коду.

Большой практикум
ЗАМЕНИ ВСЕ НЕЙРОСЕТИ НА ОДНУ — PERPLEXITY
ПОКАЖЕМ НА КОНКРЕТНЫХ КЕЙСАХ
  • Освой нейросеть Perplexity и узнай, как пользоваться функционалом остальных ИИ в одном
  • УЧАСТВОВАТЬ ЗА 0 РУБ.
  • Расскажем, как получить подписку
Участвовать бесплатно
ОНЛАЙН-ПРАКТИКУМ
ЗАПУСК нейросети DEEPSEEK R1 ЛОКАЛЬНО НА СВОЕМ КОМПЬЮТЕРЕ
ЧТО БУДЕТ НА ОБУЧЕНИИ?
  • ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросеть DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
Участвовать бесплатно