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

Запустим и посмотрим результат:

Ключевые моменты
- reversed(nums) возвращает итератор (объект типа reversed), а не новый список.
- list(reversed(nums)) создаёт новый список, содержащий обратный порядок элементов, но это новый объект.
- Оператор is проверяет тождественность (identity): одинаковый ли это объект в памяти, а не равенство содержимого.
- nums.reverse() — метод списка, меняет сам список на месте (in-place) и всегда возвращает None. Такой дизайн служит знаком того, что метод мутирует объект, а не создаёт новый.
Почему вывод именно такой
- list(reversed(nums)) is nums — сравниваем идентичность нового списка и исходного: это два разных объекта → False.
- nums.reverse() — переворачивает список на месте и возвращает None, поэтому второй элемент вывода — None.
- После вызова nums.reverse() сам список стал [3, 2, 1], поэтому третий элемент в печати — отражённое состояние nums.
Важно про порядок вычисления аргументов в вызове print
Аргументы функции вычисляются последовательно (в порядке слева направо), поэтому:
- сначала Python вычисляет list(reversed(nums)) is nums (на основе текущего nums),
- затем вызывает nums.reverse() — это меняет список,
- затем подставляет текущее значение nums в вывод.
Анализ предложенных вариантов (строк вывода)
- "Выведет: False None [3, 2, 1]" — совпадает с фактическим выводом.
- "Выведет: True None [3, 2, 1]" — неверно, потому что list(reversed(nums)) создаёт новый объект, а is вернёт False.
- "Выведет: False [3, 2, 1] [3, 2, 1]" — неверно, nums.reverse() возвращает None, а не сам список.
- "Выведет: True [3, 2, 1] [3, 2, 1]" — комбинация обоих неверных допущений: и is не будет True, и метод reverse() не возвращает список.
Полезные альтернативы и поведение
- Получить новый перевёрнутый список, не меняя исходный:

- Перевёрнуть список на месте:

- Осторожность при присваивании:

Вывод
Понимание разницы между операциями, создающими новые объекты, и методами, изменяющими объекты на месте, а также различия между is и ==, помогает предсказывать результаты выражений и избегать неожиданных None при присваивании результатов методов-мутаторов.