Сравнение array и list в Python: почему выражение возвращает False

Сравнение array и list в Python: почему выражение возвращает False

@python_quiz

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

Коротко о задаче: есть код, создающий массив из модуля array, умножающий его на 2 и сравнивающий с обычным списком. На выходе оказывается False — разберёмся, почему так происходит и какие есть правильные способы сравнения.

Условие (исходный код)

python

На первый взгляд кажется, что умножение работает как у списков — элементы повторяются, и сравнение должно вернуть True. Но фактически выражение печатает False. Разберёмся по шагам.

Что делает умножение для array

  • Операция array * n создаёт новый объект типа array с повторёнными элементами. То есть nums * 2 — это массив, содержащий [1, 2, 3, 1, 2, 3], но не список.
  • Это поведение по смыслу похоже на списки, но тип результата — не list.

Демонстрация:

python

Почему сравнение с list даёт False

Операция сравнения == между объектами разных типов не всегда выполняет поэлементное сравнение. Для array реализация сравнения ожидает сравнивать с другим array (и, как правило, с тем же кодом типа элементов). Поэтому даже если содержимое одинаковое, array(...) == [ ... ] возвращает False.

Покажем это:

python

Выводы:

  • Сравнение array с array (той же структуры) даёт True, если элементы совпадают.
  • Сравнение array с list даёт False, даже при совпадении элементов.
  • Если нужен семантический (поэлементный) контроль с list, предварительно преобразуйте array в list: list(nums * 2) == [ ... ].

Ошибки и неправильные предположения

  • Не будет ошибки TypeError при умножении массива — операция умножения допустима и возвращает array.
  • Не будет TypeError при сравнении с list — сравнение просто вернёт False, а не выбросит исключение.

Практические рекомендации

  • Сравнивайте данные одного типа: либо приведите list к array (создайте array(typecode, list)) и сравнивайте массивы, либо преобразуйте array в list с помощью list(array_obj) и сравнивайте списки.
  • Если важен только порядок и содержимое, удобнее привести оба к спискам:
python
  • Если работаете с бинарными/числовыми данными и хотите эффективность — используйте array, но учитывайте особенности сравнения и совместимости с другими последовательностями.

Итог

Хотя nums * 2 повторяет элементы как у списка, результат остаётся объектом типа array. Сравнение array и list не приводит к поэлементному равенству, поэтому выражение вида array_obj == some_list вернёт False. Чтобы сравнить по содержимому, приведите объекты к одному типу (например, к list) перед сравнением.

Report Page