在 Julia 中就地 modification/reassignment 向量而不获取副本

In-place modification/reassignment of vector in Julia without getting copies

这是一些玩具代码:

type MyType

  x::Int

end

vec = [MyType(1), MyType(2), MyType(3), MyType(4)]

ids = [2, 1, 3, 1]

vec = vec[ids]

julia> vec
4-element Array{MyType,1}:
 MyType(2)
 MyType(1)
 MyType(3)
 MyType(1)

看起来不错,除了这个行为:

julia> vec[2].x = 60
60

julia> vec
4-element Array{MyType,1}:
 MyType(2) 
 MyType(60)
 MyType(3) 
 MyType(60)

我希望能够重新排列向量的内容,我可能会删除一些值并复制其他值。但是当我复制值时,我不想要这种复制行为。有 "elegant" 的方法吗?像这样的东西可行,但是是的:

vec = [deepcopy(vec[ids[i]]) for i in 1:4]

问题是您正在创建可变类型,因此您的向量包含对实例化数据的 引用 - 因此当您基于 ids 创建向量时,您正在创建相当于结构指针向量的内容。这进一步意味着向量中具有相同 id 的元素实际上是指向同一对象的指针。

如果不确保您的引用不同,就没有好的方法可以做到这一点。这要么意味着 1) 不可变类型,这意味着你不能重新分配 x,或者 2) copy/deepcopy.