在编程世界中,复制数据是一项常见任务。然而,并非所有副本都是一样的。经常出现的两个术语是浅拷贝和深拷贝。了解它们之间的差异对于避免难以检测的错误至关重要。
A 浅拷贝仅复制对象的第一层,留下对更深层次的原始数据的引用。这意味着如果原始对象内部有其他对象(嵌套),浅复制只会复制对这些对象的引用,而不是对象本身。
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(),您就是在进行浅复制!
A 深层复制复制对象的所有级别,甚至复制嵌套结构。这意味着对副本所做的任何更改都不会影响原始对象。
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);
structuralClone() 非常适合复制复杂或圆形结构,而不会伤脑筋。
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()) 更高效,此外还允许将值完全从一个对象传输到另一个对象。
使用浅拷贝而不是深拷贝时的错误比你想象的更常见!我希望这个小指南可以帮助您避免复制数据时出现任何问题。
请在评论中告诉我,您是否已经了解深拷贝和浅拷贝以及您是否曾因它们而遇到过问题?
照片由 Mohammad Rahmani 在 Unsplash 上拍摄
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3