我对copy()功能感到困惑。据我了解,=是指针样式分配,deepcopy()正在创建一个新的独立副本。但是,我发现copy()并不是很“稳定”。请看以下两个例子:
b = [[1,2,3], [4,5,6]];
a = copy(b);
b[1][1] = 10;
a
b
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,a在赋值之后也发生了变化b[1][1]
而在第二个例子中:
b = [[1,2,3], [4,5,6]];
a = copy(b);
b[1] = [10,2,3];
a
b
Run Code Online (Sandbox Code Playgroud)
的分配b[1]并没有真正改变a。这真的很令人困惑。谁能简要解释一下发生了什么?谢谢!
copycraetes 一个浅拷贝,因此在您的情况下,对对象的引用被复制而不是真实数据。发生这种情况是因为你b是一个VectorVectors 所以这被描述为:
b = [<reference to the first vector>, <reference to the second vector>]
Run Code Online (Sandbox Code Playgroud)
当您创建一个浅层时,copy只有那些引用被复制,而没有底层数据被复制。因此,复制的引用仍然指向相同的内存地址。
在您的第二个示例中,您正在替换实际参考。由于对象a持有引用的副本,因此在b中看不到替换整个引用a。
在您拥有“对象内的对象”数据结构的任何地方都会看到这种行为。另一方面,如果您有原语数组(在引用上),您将获得一个实际副本,例如:
julia> a = [1 3; 3 4]
2×2 Matrix{Int64}:
1 3
3 4
julia> b = copy(a); b[1,1] = 100
100
julia> a
2×2 Matrix{Int64}:
1 3
3 4
Run Code Online (Sandbox Code Playgroud)