JavaScript技术问题:父数组独立时子数组仍引用其他数组?
解决JavaScript中数组赋值后修改副本影响原数组的问题
嘿,自己撸神经网络的业余开发者太酷了!不过你碰到的这个数组问题,绝对是JavaScript里新手(甚至不少老鸟)都会踩的经典坑。
你已经摸到问题的核心了——在JS里,数组属于引用类型,当你把一个数组赋值给另一个变量时,比如写了:
const originalWeights = [[0.1, 0.2], [0.3, 0.4]]; const copiedWeights = originalWeights;
这时候copiedWeights并没有拿到一个全新的数组副本,它只是拿到了指向原数组在内存中位置的引用。说白了,两个变量其实指向同一块内存里的数组,不管你修改哪一个,本质上都是在操作同一个东西,自然会导致原数组跟着变。
针对你做神经网络的场景,这里给你几种实用的解决方法:
一维数组用浅拷贝就够了
如果你的数组是一维的(比如单神经元的权重数组),用下面几种方法都能轻松创建独立的副本:
- 扩展运算符(最简洁的写法):
const copyArr = [...originalArr]; Array.from()方法:const copyArr = Array.from(originalArr);slice()方法(不传参数就是复制整个数组):const copyArr = originalArr.slice();
多维数组必须用深拷贝
神经网络里肯定会用到多维数组(比如层与层之间的权重矩阵),这时候上面的浅拷贝就不管用了——因为嵌套的子数组依然是引用类型,修改子数组还是会影响原数组。这时候可以用:
- JSON序列化反序列化(简单粗暴,注意不能处理函数、
undefined这类特殊值,不过神经网络的权重一般都是数字,完全适用):const copyArr = JSON.parse(JSON.stringify(originalArr)); - 手写递归深拷贝函数(更灵活,能处理复杂嵌套结构):
function deepCopy(arr) { return arr.map(item => Array.isArray(item) ? deepCopy(item) : item); } const copyArr = deepCopy(originalArr);
用这些方法创建的副本,再修改的时候就不会影响原数组了,正好能满足你神经网络里更新权重、保留原始参数这类需求~
内容的提问来源于stack exchange,提问作者Aden Power
相关产品推荐
相关产品推荐

