何时更改对象也会更改对象的副本?

Yil*_*ang 2 julia

我对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。这真的很令人困惑。谁能简要解释一下发生了什么?谢谢!

Prz*_*fel 5

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)