Почему список Python не реализует __copy__ и __deepcopy__

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

Почему в списке нет методов __copy__ и __deepcopy__, в отличие от массива?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для встроенных типов, таких как list, copy.deepcopy() знает, как создать глубокую копию, и поэтому list не нужен собственный __deepcopy__() метод dunder.

Вы добавляете такой метод в свои собственные классы, если Python нужно сделать что-то большее, чем то, что определено для встроенного базового типа, от которого он наследуется (например, object или list).

Обратите внимание, что это означает, что вам не следует использовать информацию о том, реализует ли класс __deepcopy__, в качестве прокси-ответа на вопрос «можно ли этот класс глубоко скопировать?»

Редактировать: в комментариях вы снова спросили, почему array не получил того же лечения, что и list. Я не смотрел код Python в поисках ответа, но подозреваю, что это связано с тем, что list может содержать смесь типов, а array содержит один тип. В результате при копировании массива, зная тип содержимого, можно более эффективно копировать массивы этого типа. Вы не хотели бы обременять более общий deepcopy этой логикой и вместо этого можете использовать эти явные методы, что особенно актуально при глубоком копировании.

Спасибо за ваш добрый ответ и комментарии. Я понимаю, почему list не нужны методы __copy__ и __deepcopy__. Но я до сих пор не уверен, зачем массиву нужны методы __copy__ и __deepcopy__. Это потому, что модуль копирования не знает, как копировать (глубоко копировать) массив? Так почему я не могу это узнать?

YouHoGeon 03.04.2024 14:39

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

YouHoGeon 03.04.2024 14:41

@YouHoGeon ну, list реализован на C.

juanpa.arrivillaga 03.04.2024 18:01

Я обновил ответ, подумав о том, почему array их нет - я думаю, что это правильно, но вы могли бы более внимательно изучить исходный код C для массива, чтобы увидеть, как все рассматривается подробно. Модуль копирования «знает», как копировать массив, но для чего-то вроде массива (часто больших количеств одного и того же типа) вам нужно не просто четкое и простое «как», вам, вероятно, также нужна некоторая производительность или вместо этого вы можете использовать список.

Grismar 04.04.2024 00:58

Другие вопросы по теме