Поведение reversed() и list.reverse() в Python
@python_quizРазберем этот квиз
Код, который разбираем:

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

Дальше — почему так происходит и какие тонкости здесь важно помнить.
Пошаговый разбор
- list(reversed(nums)) создаёт новый список. Функция reversed(nums) возвращает итератор, а вызов list(...) материализует новый объект списка, содержащий элементы в обратном порядке. Этот новый объект отличается по идентичности от исходного списка nums.
- Оператор is сравнивает не содержимое, а идентичность объектов в памяти. Поскольку был создан новый список, проверка is даёт False.
- nums.reverse() — метод списка, который меняет сам объект nums на месте (in-place) и при этом возвращает None. Это стандартное поведение многих методов, которые мутируют объект (например, list.sort()).
- Вызовы аргументов в функции 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__у объектов).
Пример:

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

Важно: не полагайтесь на возвращаемое значение у in-place методов. Частая ошибка — писать что-то вроде new = some_list.sort() и ожидать, что new будет отсортированным списком; вместо этого new будет None.
Полезные рекомендации (best practices)
- Если нужно новый список в обратном порядке, используйте list(reversed(nums)) или nums[::-1].
- Если нужно изменить существующий список — используйте nums.reverse(), но не присваивайте его результат переменной.
- Для сравнения содержимого используйте ==, а is оставьте для проверки идентичности (например, проверка на None: x is None).
Наглядная демонстрация

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