Поведение reversed(), list.reverse() и оператора is в Python

Поведение reversed(), list.reverse() и оператора is в Python

@python_quiz

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

Код из квиза:

python

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

python

Ключевые моменты

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

Почему вывод именно такой

  1. list(reversed(nums)) is nums — сравниваем идентичность нового списка и исходного: это два разных объекта → False.
  2. nums.reverse() — переворачивает список на месте и возвращает None, поэтому второй элемент вывода — None.
  3. После вызова 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() не возвращает список.

Полезные альтернативы и поведение

  • Получить новый перевёрнутый список, не меняя исходный:
python
  • Перевёрнуть список на месте:
python
  • Осторожность при присваивании:
python

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

Report Page