В мире программирования копирование данных — обычная задача. Однако не все копии одинаковы. Часто встречаются два термина: мелкое копирование и глубокое копирование. Понимание разницы между ними имеет решающее значение, чтобы избежать ошибок, которые трудно обнаружить.
Поверхностная копия копирует только первый уровень объекта, оставляя ссылки на исходные данные на более глубоких уровнях. Это означает, что если исходный объект содержит внутри себя другие объекты (вложенные), мелкая копия будет копировать только ссылки на эти объекты, а не сами объекты.
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]]
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(), вы выполняете поверхностное копирование!
глубокая копия копирует все уровни объекта, дублируя даже вложенные структуры. Это означает, что любые изменения, внесенные в копию, не повлияют на исходный объект.
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]]
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!)
Всегда проверяйте, есть ли у вашего объекта вложенные уровни, прежде чем выбирать между поверхностной или глубокой копией.
const originalObject = { a: 1, b: { c: 2 } }; const shallowCopy = Object.assign({}, originalObject);
const originalArray = [1, 2, 3]; const shallowCopy = [...originalArray];
const originalObject = { a: 1, b: { c: 2 } }; const deepCopy = structuredClone(originalObject);
structuredClone() идеально подходит для копирования сложных или циклических структур, не ломая голову.
const _ = require('lodash'); const originalObject = { a: 1, b: { c: 2 } }; const deepCopy = _.cloneDeep(originalObject);
import copy original_list = [1, 2, [3, 4]] shallow_copy = copy.copy(original_list) deep_copy = copy.deepcopy(original_list)
В Python иногда все, что вам нужно, — это неглубокая копия, чтобы избежать случайных изменений в списках!
Подводя итог, можно сказать, что как поверхностные, так и глубокие копии имеют свое применение. Главное — понять структуру данных, с которыми вы работаете, и выбрать подходящий метод копирования.
Да, поскольку копируется меньше данных.
Да, с помощью JSON.parse(JSON.stringify()) или StructuredClone().
Исходный объект также будет затронут.
Не обязательно, только если вы работаете со сложными структурами данных.
Он является нативным, поддерживает циклические структуры и более эффективен, чем JSON.parse(JSON.stringify()), а также позволяет полностью переносить значения из одного объекта в другой.
Ошибки при использовании поверхностных копий вместо глубоких копий встречаются чаще, чем вы думаете! Надеюсь, это небольшое руководство поможет вам избежать проблем при копировании данных.
Дайте мне знать в комментариях, знаете ли вы уже о глубоких и поверхностных копиях и возникали ли у вас когда-нибудь проблемы из-за них?
Фото Мохаммада Рахмани на Unsplash
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3