变量引用机制

对于可变复合类型(使用 ismuttable 判断),在赋值与传参时使用引用机制。 考虑以下代码:

julia> x=[1, 2, 3];

julia> y=x;

julia> x=[4, 5, 6];

julia> y
3-element Vector{Int64}:
 1
 2
 3

再考虑如下代码

julia> x=[1, 2, 3];

julia> y=x;

julia> x[1]=0;

julia> y
3-element Vector{Int64}:
 0
 2
 3

第一例中,在 x=[1, 2, 3] 时,首先数据被分配到某个位置(记作 h1),然后创建 x 作为 h1 的引用/绑定

img

y=x 意图将 y 指向 x 对应的数据,实际也是 h1 的引用

img

x=[4, 5, 6] 操作产生新的数据块并更改 x 的绑定,而这不会影响到 y

img

而第二例的操作改变了 h1 里的数据,显得 y “同步更改”了

拷贝

copy 函数可以对数组进行「浅拷贝(shallow-copy)」,它只会复制外壳而不会复制内部数据

julia> a=[MS(0)]
1-element Vector{MS}:
 MS(0)

julia> b=copy(a)
1-element Vector{MS}:
 MS(0)

julia> push!(b, MS(1)); a
1-element Vector{MS}:
 MS(0)

julia> b[1].v=1; a
1-element Vector{MS}:
 MS(1)

deepcopy 函数可以对物体进行「深拷贝(deep-copy)」,它会复制所有东西,使用它可以不必担心互相干扰的问题。

改变不可变值

利用 Setfield 提供的,你可以“改变”不可变类型变量的指定字段