«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Мелкая копия против глубокой копии – что они на самом деле? - Примеры с JavaScript и Python

Мелкая копия против глубокой копии – что они на самом деле? - Примеры с JavaScript и Python

Опубликовано 31 августа 2024 г.
Просматривать:421

Введение

В мире программирования копирование данных — обычная задача. Однако не все копии одинаковы. Часто встречаются два термина: мелкое копирование и глубокое копирование. Понимание разницы между ними имеет решающее значение, чтобы избежать ошибок, которые трудно обнаружить.

Что такое мелкая копия?

Поверхностная копия копирует только первый уровень объекта, оставляя ссылки на исходные данные на более глубоких уровнях. Это означает, что если исходный объект содержит внутри себя другие объекты (вложенные), мелкая копия будет копировать только ссылки на эти объекты, а не сами объекты.

Пример на JavaScript

const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]]
console.log(shallowCopy);   // [1, 2, [99, 4]]

Пример на Python

import copy

original_list = [1, 2, [3, 4]]
shallow_copy = copy.copy(original_list)

shallow_copy[2][0] = 99

print(original_list)  # [1, 2, [99, 4]]
print(shallow_copy)   # [1, 2, [99, 4]]

Кончик:

Неполное копирование полезно, когда вы знаете, что вам не нужно изменять вложенные объекты. Это быстрее и потребляет меньше памяти, чем глубокая копия.

Примечание:

Если в JavaScript вы используете Array.slice() или Object.assign(), вы выполняете поверхностное копирование!

Что такое глубокая копия?

глубокая копия копирует все уровни объекта, дублируя даже вложенные структуры. Это означает, что любые изменения, внесенные в копию, не повлияют на исходный объект.

Пример на JavaScript

const originalArray = [1, 2, [3, 4]];
const deepCopy = JSON.parse(JSON.stringify(originalArray));

deepCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [3, 4]]
console.log(deepCopy);      // [1, 2, [99, 4]]

Пример на Python

import copy

original_list = [1, 2, [3, 4]]
deep_copy = copy.deepcopy(original_list)

deep_copy[2][0] = 99

print(original_list)  # [1, 2, [3, 4]]
print(deep_copy)      # [1, 2, [99, 4]]

Кончик:

Если вы работаете со сложными или вложенными структурами данных, глубокое копирование — самый безопасный вариант, позволяющий избежать нежелательных побочных эффектов.

Примечание:

В Python функция copy.deepcopy() поможет вам безопасно дублировать сложные объекты.

Прямое сравнение: мелкая копия и глубокая копия

Вот прямое сравнение поверхностного и глубокого текста:

Особенность Поверхностная копия Глубокое копирование
Неполный текст Ага Нет
Глубокое копирование Нет Ага
Изменения исходного объекта влияют на копию Ага Нет
Сложность Низкий Высокий

Кончик:

Помните, что мелкое копирование выполняется быстрее, но глубокое копирование безопаснее при работе со сложными объектами.

Общие случаи использования

Когда использовать мелкую копию

  • Когда вы работаете с объектами или простыми структурами данных.
  • Когда вам нужно улучшить производительность, глубокие модификации не являются проблемой.
  • Примеры: конфигурации приложений, временное зеркалирование данных.

Когда использовать глубокое копирование

  • Когда вы работаете с вложенными или сложными структурами данных.
  • Когда вам нужно убедиться, что изменения в копии не влияют на оригинал.
  • Примеры: сложные манипуляции с данными, приложения, требующие высокого уровня безопасности и согласованности.

Примечание:

Неполные копии отлично подходят для дублирования легких настроек приложений или временных данных!

Распространенные проблемы и как их избежать

Проблемы с поверхностным копированием

Распространенной ошибкой является использование поверхностной копии вместо глубокой копии, когда данные вложены. Это может привести к нежелательным изменениям исходного объекта.

Пример:

const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]] (¡No esperado!)

Кончик:

Всегда проверяйте, есть ли у вашего объекта вложенные уровни, прежде чем выбирать между поверхностной или глубокой копией.

Инструменты и функции для создания копий в JavaScript

Использование Object.assign() для поверхностного копирования

const originalObject = { a: 1, b: { c: 2 } };
const shallowCopy = Object.assign({}, originalObject);

Использование ...spread для поверхностного копирования

const originalArray = [1, 2, 3];
const shallowCopy = [...originalArray];

Использование StructuredClone() для глубокого копирования

const originalObject = { a: 1, b: { c: 2 } };
const deepCopy = structuredClone(originalObject);

Кончик:

structuredClone() идеально подходит для копирования сложных или циклических структур, не ломая голову.

Использование библиотек, таких как Lodash, для глубокого копирования

const _ = require('lodash');
const originalObject = { a: 1, b: { c: 2 } };
const deepCopy = _.cloneDeep(originalObject);

Инструменты и функции для копирования в Python

Использование модуля копирования

import copy

original_list = [1, 2, [3, 4]]
shallow_copy = copy.copy(original_list)
deep_copy = copy.deepcopy(original_list)

Различия между copy.copy() и copy.deepcopy()

  • copy.copy(): Неполное копирование.
  • copy.deepcopy(): Глубокое копирование.

Примечание:

В Python иногда все, что вам нужно, — это неглубокая копия, чтобы избежать случайных изменений в списках!

Резюме и заключение

Подводя итог, можно сказать, что как поверхностные, так и глубокие копии имеют свое применение. Главное — понять структуру данных, с которыми вы работаете, и выбрать подходящий метод копирования.

Часто задаваемые вопросы

1. Всегда ли поверхностное копирование быстрее глубокого копирования?

Да, поскольку копируется меньше данных.

2. Можете ли вы сделать глубокое копирование без внешних библиотек в JavaScript?

Да, с помощью JSON.parse(JSON.stringify()) или StructuredClone().

3. Что произойдет, если я попытаюсь изменить объект, вложенный в неполную копию?

Исходный объект также будет затронут.

4. Лучше ли всегда использовать глубокое копирование, чтобы избежать проблем?

Не обязательно, только если вы работаете со сложными структурами данных.

5. Какие преимущества имеет StructuredClone() перед другими методами глубокого копирования в JavaScript?

Он является нативным, поддерживает циклические структуры и более эффективен, чем JSON.parse(JSON.stringify()), а также позволяет полностью переносить значения из одного объекта в другой.


Ошибки при использовании поверхностных копий вместо глубоких копий встречаются чаще, чем вы думаете! Надеюсь, это небольшое руководство поможет вам избежать проблем при копировании данных.

Дайте мне знать в комментариях, знаете ли вы уже о глубоких и поверхностных копиях и возникали ли у вас когда-нибудь проблемы из-за них?


Shallow Copy vs Deep Copy - ¿Qué son realmente? - Ejemplos con JavaScript y Python

Блокнот BYXN? | Подстек

Мой публичный блокнот! ???. Нажмите, чтобы прочитать записную книжку BYXN?, публикацию Substack. Запущен 17 дней назад.

Shallow Copy vs Deep Copy - ¿Qué son realmente? - Ejemplos con JavaScript y Python bhyxen.substack.com

Фото Мохаммада Рахмани на Unsplash

Заявление о выпуске Эта статья воспроизводится по адресу: https://dev.to/bhyxen/shallo-copy-vs-deep-que-que-son-reaelmente-ejemplos-con-javascript-y-python-10ja?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с исследованием[email protected], чтобы удалить его.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3