在 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
.
这是一些玩具代码:
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
.