Сравнение array и list в Python: почему выражение возвращает False
@python_quizРазберем этот квиз
Коротко о задаче: есть код, создающий массив из модуля array, умножающий его на 2 и сравнивающий с обычным списком. На выходе оказывается False — разберёмся, почему так происходит и какие есть правильные способы сравнения.
Условие (исходный код)

На первый взгляд кажется, что умножение работает как у списков — элементы повторяются, и сравнение должно вернуть True. Но фактически выражение печатает False. Разберёмся по шагам.
Что делает умножение для array
- Операция
array * nсоздаёт новый объект типа array с повторёнными элементами. То естьnums * 2— это массив, содержащий [1, 2, 3, 1, 2, 3], но не список. - Это поведение по смыслу похоже на списки, но тип результата — не list.
Демонстрация:

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

Выводы:
- Сравнение 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)и сравнивайте списки. - Если важен только порядок и содержимое, удобнее привести оба к спискам:

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