这是一些玩具代码:
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]
答案 0 :(得分:2)
问题在于您正在创建可变类型,因此您的向量包含引用到实例化数据 - 所以当您基于ids
创建向量时,您&# 39;重新创建相当于结构指针的向量。这进一步意味着向量中具有相同id
的元素实际上是指向同一对象的指针。
如果不确保您的参考文献不同,那么没有好办法。这意味着1)不可变类型,这意味着您无法重新分配x
,或2)copy
/ deepcopy
。