在Julia中就地修改/重新分配矢量而不获取副本

时间:2017-07-26 16:48:06

标签: vector julia in-place

这是一些玩具代码:

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)

我希望能够重新排列向量的内容,可能会消除某些值并复制其他值。但是当我复制值时,我不希望这种复制行为。有这种“优雅”的方式吗?这样的事情有效,但耶和华:

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

1 个答案:

答案 0 :(得分:2)

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

如果不确保您的参考文献不同,那么没有好办法。这意味着1)不可变类型,这意味着您无法重新分配x,或2)copy / deepcopy