问题描述
我正在用 Julia 编写代码,它从函数 foo
(它改变其输入参数)收集一些输出,并且我试图将来自该函数的递归评估附加到数组 A
中.
例如,foo!(x)
通过向其每个元素添加 x
来更改 1
的值。
function foo!(x)
x .= x .+ 1
return(x)
end
julia> x = [1,1];
julia> foo!(x);
julia> x
2-element Array{Int64,1}:
2
2
我想创建一个数组 A
,它在固定范围内存储 x = f(x)
的值。然而,A
只是最终包含 f(x)
的最终值的多个副本,例如,
julia> x = [1,1];
julia> A = [x];
julia> for i=1:3
push!(A,foo!(x))
end
julia> A
4-element Array{Array{Int64,1},1}:
[4,4]
[4,4]
我试图让它有效地输出类似于
julia> B
4-element Array{Array{Int64,1}:
[1,1]
[2,2]
[3,3]
[4,4]
我一直无法找到有用的资源来深入了解突变,或者在 Julia 中执行突变的顺序。在这方面的任何帮助将不胜感激!
解决方法
按照您编写它的方式,您将同一个对象反复 push!
放入 A
,您的 foo!
函数会对其进行变异:
julia> x = [1,1]
2-element Vector{Int64}:
1
1
julia> A = [x]
1-element Vector{Vector{Int64}}:
[1,1]
julia> foo!(x)
2-element Vector{Int64}:
2
2
julia> A
1-element Vector{Vector{Int64}}:
[2,2]
解决此问题的一种方法是在 copy
发生变异之前 A
x
中的元素:
julia> for i ∈ 1:3
A[i] = copy(x)
push!(A,foo!(x))
end
julia> A
4-element Vector{Vector{Int64}}:
[1,1]
[2,2]
[3,3]
[4,4]
可以找到关于值与绑定的经典阅读here。
,通过仅使用 push!
,您只是创建了对单个数组(即 x
)的引用数组。这就是为什么您会看到多次重复相同的值。
如果您想在 x
的调用中保留 foo!
的值的副本,您可以使用 copy
:
julia> foo!(x) = x .+= 1
foo! (generic function with 1 method)
julia> x = [0,0];
julia> A = [copy(foo!(x)) for i in 1:4]
4-element Vector{Vector{Int64}}:
[1,4]