Поведение reversed() и list.reverse() в Python

Поведение reversed() и list.reverse() в Python

@python_quiz

Разберем этот квиз

Код, который разбираем:

python

Краткий ответ (что именно выведет этот код):

Дальше — почему так происходит и какие тонкости здесь важно помнить.

Пошаговый разбор

  1. list(reversed(nums)) создаёт новый список. Функция reversed(nums) возвращает итератор, а вызов list(...) материализует новый объект списка, содержащий элементы в обратном порядке. Этот новый объект отличается по идентичности от исходного списка nums.
  2. Оператор is сравнивает не содержимое, а идентичность объектов в памяти. Поскольку был создан новый список, проверка is даёт False.
  3. nums.reverse() — метод списка, который меняет сам объект nums на месте (in-place) и при этом возвращает None. Это стандартное поведение многих методов, которые мутируют объект (например, list.sort()).
  4. Вызовы аргументов в функции print вычисляются слева направо, поэтому последовательность действий: сначала вычисляется выражение с is, затем вызывается nums.reverse(), затем подставляется текущее значение nums (уже изменённого).

Итоговое представление промежуточных шагов:

  • list(reversed(nums)) is nums → False
  • nums.reverse() → None (и в результате nums становится [3, 2, 1])
  • nums → [3, 2, 1]

is vs == — коротко о различиях

  • is проверяет, ссылаются ли два имени на один и тот же объект в памяти.
  • == проверяет эквивалентность значений (через метод __eq__ у объектов).

Пример:

python

Если нужно проверить, что два списка содержат одинаковые элементы, используйте ==, а не is.

reversed() vs list.reverse() и альтернативы

  • reversed(x) возвращает итератор, не модифицирует исходный объект.
  • list.reverse() модифицирует список на месте и возвращает None.
  • Срезы с шагом -1 (nums[::-1]) создают новый список и не меняют оригинал.

Примеры:

python

Важно: не полагайтесь на возвращаемое значение у in-place методов. Частая ошибка — писать что-то вроде new = some_list.sort() и ожидать, что new будет отсортированным списком; вместо этого new будет None.

Полезные рекомендации (best practices)

  • Если нужно новый список в обратном порядке, используйте list(reversed(nums)) или nums[::-1].
  • Если нужно изменить существующий список — используйте nums.reverse(), но не присваивайте его результат переменной.
  • Для сравнения содержимого используйте ==, а is оставьте для проверки идентичности (например, проверка на None: x is None).

Наглядная демонстрация

python

Вывод покажет разные id для новых списков и изменённый nums после nums.reverse().

Выводы

  • list(reversed(nums)) создаёт новый список, поэтому identity-проверка через is даёт False.
  • nums.reverse() меняет список на месте и возвращает None, поэтому в выражениях она будет отображаться как None.
  • Используйте == для сравнения содержимого списков и избегайте присваивания результата in-place методов.

Report Page