В отличие от массива Python, который реализует __copy__ и __deepcopy__, чтобы модуль копирования мог его использовать,
Список Python не реализует __copy__ и __deepcopy__. (хотя есть метод копирования)
Вместо этого логика, связанная с копированием списка, реализована в функции копирования и функции глубокого копирования модуля копирования.
Почему в списке нет методов __copy__ и __deepcopy__, в отличие от массива?






Для встроенных типов, таких как list, copy.deepcopy() знает, как создать глубокую копию, и поэтому list не нужен собственный __deepcopy__() метод dunder.
Вы добавляете такой метод в свои собственные классы, если Python нужно сделать что-то большее, чем то, что определено для встроенного базового типа, от которого он наследуется (например, object или list).
Обратите внимание, что это означает, что вам не следует использовать информацию о том, реализует ли класс __deepcopy__, в качестве прокси-ответа на вопрос «можно ли этот класс глубоко скопировать?»
Редактировать: в комментариях вы снова спросили, почему array не получил того же лечения, что и list. Я не смотрел код Python в поисках ответа, но подозреваю, что это связано с тем, что list может содержать смесь типов, а array содержит один тип. В результате при копировании массива, зная тип содержимого, можно более эффективно копировать массивы этого типа. Вы не хотели бы обременять более общий deepcopy этой логикой и вместо этого можете использовать эти явные методы, что особенно актуально при глубоком копировании.
Поскольку массив реализован на C, я предположил, что он должен предоставить Python интерфейс для копирования (глубокого копирования), чтобы обеспечить более эффективное копирование. Верна ли моя догадка?
@YouHoGeon ну, list реализован на C.
Я обновил ответ, подумав о том, почему array их нет - я думаю, что это правильно, но вы могли бы более внимательно изучить исходный код C для массива, чтобы увидеть, как все рассматривается подробно. Модуль копирования «знает», как копировать массив, но для чего-то вроде массива (часто больших количеств одного и того же типа) вам нужно не просто четкое и простое «как», вам, вероятно, также нужна некоторая производительность или вместо этого вы можете использовать список.
Спасибо за ваш добрый ответ и комментарии. Я понимаю, почему list не нужны методы
__copy__и__deepcopy__. Но я до сих пор не уверен, зачем массиву нужны методы__copy__и__deepcopy__. Это потому, что модуль копирования не знает, как копировать (глубоко копировать) массив? Так почему я не могу это узнать?